aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rebar.config3
-rw-r--r--src/gleam/json.gleam15
-rw-r--r--src/gleam/json/types.gleam13
-rw-r--r--test/gleam/json_test.gleam14
-rw-r--r--test/gleam_json_test.gleam7
5 files changed, 44 insertions, 8 deletions
diff --git a/rebar.config b/rebar.config
index 09d63c0..49fb1b7 100644
--- a/rebar.config
+++ b/rebar.config
@@ -8,5 +8,6 @@
{project_plugins, [rebar_gleam]}.
{deps, [
- {gleam_stdlib, "0.10.1"}
+ {gleam_stdlib, "0.10.1"},
+ {jsone, "1.5.2"}
]}.
diff --git a/src/gleam/json.gleam b/src/gleam/json.gleam
new file mode 100644
index 0000000..e1e465b
--- /dev/null
+++ b/src/gleam/json.gleam
@@ -0,0 +1,15 @@
+import gleam/dynamic.{Dynamic}
+import gleam/result
+import gleam/json/types
+
+pub type Json = types.Json
+
+external fn jsone_decode(String) -> types.DecodeResult =
+ "jsone_decode" "decode"
+
+pub fn decode(encoded: String) -> Result(Json, Dynamic) {
+ case jsone_decode(encoded) {
+ types.Ok(json, _rest) -> Ok(json)
+ types.Error(types.Badarg(reason)) -> Error(reason)
+ }
+}
diff --git a/src/gleam/json/types.gleam b/src/gleam/json/types.gleam
new file mode 100644
index 0000000..2e6c78f
--- /dev/null
+++ b/src/gleam/json/types.gleam
@@ -0,0 +1,13 @@
+import gleam/dynamic.{Dynamic}
+
+
+pub external type Json
+
+pub type Failure {
+ Badarg(Dynamic)
+}
+
+pub type DecodeResult {
+ Ok(Json, String)
+ Error(Failure)
+}
diff --git a/test/gleam/json_test.gleam b/test/gleam/json_test.gleam
new file mode 100644
index 0000000..84f0352
--- /dev/null
+++ b/test/gleam/json_test.gleam
@@ -0,0 +1,14 @@
+import gleam/dynamic
+import gleam/result
+import gleam/json.{Json}
+import gleam/should
+
+pub fn decode_test() {
+ json.decode("5")
+ |> result.map(dynamic.from)
+ |> should.equal(Ok(dynamic.from(5)))
+
+ json.decode(".")
+ |> result.nil_error()
+ |> should.equal(Error(Nil))
+}
diff --git a/test/gleam_json_test.gleam b/test/gleam_json_test.gleam
deleted file mode 100644
index d3b7633..0000000
--- a/test/gleam_json_test.gleam
+++ /dev/null
@@ -1,7 +0,0 @@
-import gleam_json
-import gleam/should
-
-pub fn hello_world_test() {
- gleam_json.hello_world()
- |> should.equal("Hello, from gleam_json!")
-}