Current section
Files
Jump to
Current section
Files
src/touch_grass/decode_json.gleam
import eyg/interpreter/cast
import eyg/interpreter/value as v
import gleam/dict
import gleam/list
import gleam/result
import julienne
pub const decode = cast.as_binary
pub fn encode(result) {
case result {
Ok(parsed) -> {
let list =
v.LinkedList(
list.map(parsed, fn(item) {
let #(term, depth) = item
let term = case term {
julienne.Boolean(True) -> v.true()
julienne.Boolean(False) -> v.false()
julienne.Null -> v.Tagged("Null", v.unit())
julienne.String(value) -> v.Tagged("String", v.String(value))
julienne.Integer(i) -> v.Tagged("Integer", v.Integer(i))
julienne.Number(sign:, integer:, decimal:, exponent:) ->
v.Tagged(
"Number",
v.Record(
dict.from_list([
#("sign", case sign {
julienne.Positive -> v.Tagged("Positive", v.unit())
julienne.Negative -> v.Tagged("Negative", v.unit())
}),
#("integer", v.Integer(integer)),
#(
"decimal",
v.Record(
dict.from_list([
#("numerator", v.Integer(decimal.0)),
#("size", v.Integer(decimal.1)),
]),
),
),
#("exponent", v.Integer(exponent)),
]),
),
)
julienne.Array -> v.Tagged("Array", v.unit())
julienne.Object -> v.Tagged("Object", v.unit())
julienne.Field(f) -> v.Tagged("Field", v.String(f))
}
v.Record(
dict.from_list([#("term", term), #("depth", v.Integer(depth))]),
)
}),
)
v.ok(list)
}
Error(reason) -> v.error(v.String(reason))
}
}
pub fn sync(raw) {
let result =
julienne.parse_bits(raw)
|> result.map_error(julienne.describe_reason)
encode(result)
}