-module(glean@json_value). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/glean/json_value.gleam"). -export([to_json/1, to_string/1, decoder/0, dynamic_to_string/1, parse_to_json/1]). -export_type([json_value/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -type json_value() :: json_null | {json_bool, boolean()} | {json_int, integer()} | {json_float, float()} | {json_string, binary()} | {json_array, list(json_value())} | {json_object, list({binary(), json_value()})}. -file("src/glean/json_value.gleam", 44). ?DOC(false). -spec to_json(json_value()) -> gleam@json:json(). to_json(Value) -> case Value of json_null -> gleam@json:null(); {json_bool, B} -> gleam@json:bool(B); {json_int, I} -> gleam@json:int(I); {json_float, F} -> gleam@json:float(F); {json_string, S} -> gleam@json:string(S); {json_array, Items} -> gleam@json:preprocessed_array(gleam@list:map(Items, fun to_json/1)); {json_object, Fields} -> gleam@json:object( gleam@list:map( Fields, fun(Kv) -> {erlang:element(1, Kv), to_json(erlang:element(2, Kv))} end ) ) end. -file("src/glean/json_value.gleam", 58). ?DOC(false). -spec to_string(json_value()) -> binary(). to_string(Value) -> _pipe = to_json(Value), gleam@json:to_string(_pipe). -file("src/glean/json_value.gleam", 32). ?DOC(false). -spec non_null_decoder() -> gleam@dynamic@decode:decoder(json_value()). non_null_decoder() -> gleam@dynamic@decode:one_of( begin _pipe = {decoder, fun gleam@dynamic@decode:decode_string/1}, gleam@dynamic@decode:map( _pipe, fun(Field@0) -> {json_string, Field@0} end ) end, [begin _pipe@1 = {decoder, fun gleam@dynamic@decode:decode_int/1}, gleam@dynamic@decode:map( _pipe@1, fun(Field@0) -> {json_int, Field@0} end ) end, begin _pipe@2 = {decoder, fun gleam@dynamic@decode:decode_float/1}, gleam@dynamic@decode:map( _pipe@2, fun(Field@0) -> {json_float, Field@0} end ) end, begin _pipe@3 = {decoder, fun gleam@dynamic@decode:decode_bool/1}, gleam@dynamic@decode:map( _pipe@3, fun(Field@0) -> {json_bool, Field@0} end ) end, begin _pipe@4 = gleam@dynamic@decode:list(decoder()), gleam@dynamic@decode:map( _pipe@4, fun(Field@0) -> {json_array, Field@0} end ) end, begin _pipe@5 = gleam@dynamic@decode:dict( {decoder, fun gleam@dynamic@decode:decode_string/1}, decoder() ), gleam@dynamic@decode:map( _pipe@5, fun(D) -> {json_object, maps:to_list(D)} end ) end] ). -file("src/glean/json_value.gleam", 22). ?DOC(false). -spec decoder() -> gleam@dynamic@decode:decoder(json_value()). decoder() -> gleam@dynamic@decode:recursive( fun() -> gleam@dynamic@decode:then( gleam@dynamic@decode:optional(non_null_decoder()), fun(Opt) -> case Opt of none -> gleam@dynamic@decode:success(json_null); {some, Val} -> gleam@dynamic@decode:success(Val) end end ) end ). -file("src/glean/json_value.gleam", 64). ?DOC(false). -spec dynamic_to_string(gleam@dynamic:dynamic_()) -> binary(). dynamic_to_string(Value) -> case gleam@dynamic@decode:run(Value, decoder()) of {ok, Json_value} -> to_string(Json_value); {error, _} -> <<"{}"/utf8>> end. -file("src/glean/json_value.gleam", 74). ?DOC(false). -spec parse_to_json(binary()) -> gleam@json:json(). parse_to_json(Json_string) -> case gleam@json:parse(Json_string, decoder()) of {ok, Json_value} -> to_json(Json_value); {error, _} -> gleam@json:object([]) end.