-module(aws@internal@codec@json_document). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/aws/internal/codec/json_document.gleam"). -export([from_dynamic/1, decoder/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( " `smithy.api#Document` codec. Documents are \"any JSON value\" — the\n" " service doesn't constrain the shape. We carry them as `json.Json`\n" " so round-trips are byte-stable: decode a document field, re-encode\n" " it, and you get the same JSON back out.\n" "\n" " Backed by FFI because `gleam_json.Json` is opaque and there's no\n" " public constructor for \"raw JSON\". On the Erlang side `Json` is\n" " just iodata, so `raw/1` is a no-op cast.\n" ). -file("src/aws/internal/codec/json_document.gleam", 17). ?DOC( " Take a dynamic value (whatever `decode.dynamic` produced) and turn\n" " it into a `json.Json`. Round-trips through `aws_ffi:encode_dynamic_to_json`,\n" " then casts the resulting binary back to the opaque `Json` type.\n" ). -spec from_dynamic(gleam@dynamic:dynamic_()) -> gleam@json:json(). from_dynamic(D) -> case aws_ffi:encode_dynamic_to_json(D) of {ok, Bin} -> gleam_json_ffi:json_to_string(Bin); {error, _} -> gleam@json:null() end. -file("src/aws/internal/codec/json_document.gleam", 27). ?DOC( " Decoder for a Document field. Always succeeds — Documents accept\n" " any JSON shape including nulls, so failure is never the right\n" " answer at this layer.\n" ). -spec decoder() -> gleam@dynamic@decode:decoder(gleam@json:json()). decoder() -> gleam@dynamic@decode:then( {decoder, fun gleam@dynamic@decode:decode_dynamic/1}, fun(D) -> gleam@dynamic@decode:success(from_dynamic(D)) end ).