//! JSON serialization
//!
//! _This module is only available if gluon is compiled with the `serialization` feature._
let { Value } = import! std.json
let prim = import! std.json.prim
let { Result, ? } = import! std.result
let { for } = import! std.traversable
let { map } = import! std.functor
let { ? } = import! std.array
let { Map, ? } = import! std.map
type Error = String
type ValueSerializer a = { serialize : a -> Result Error Value }
#[implicit]
type Serialize a = ValueSerializer a
let serialize ?ser : [Serialize a] -> a -> Result Error Value = ser.serialize
/// Serializes `a` to a JSON without whitespace string
///
/// ```
/// let { ? } = import! std.effect
/// let { Value, to_string, ? } = import! std.json.ser
/// let { Result, ? } = import! std.result
/// let { singleton, ? } = import! std.map
/// let { (<>) } = import! std.semigroup
/// let { assert_eq, ? } = import! std.test
///
/// seq assert_eq (to_string "string") (Ok r#""string""#)
///
/// let expected = r#"[1,2,3]"#
/// seq assert_eq (to_string [1, 2, 3]) (Ok expected)
///
/// let expected = r#"{"field":1}"#
/// assert_eq (to_string (singleton "field" 1)) (Ok expected)
/// ```
let to_string v : [Serialize a] -> a -> Result Error String =
do value = serialize v
prim.serialize value
/// Serializes `a` to a JSON string
///
/// ```
/// let { ? } = import! std.effect
/// let { Value, to_string_pretty, ? } = import! std.json.ser
/// let { Result, ? } = import! std.result
/// let { singleton, ? } = import! std.map
/// let { (<>) } = import! std.semigroup
/// let { assert_eq, ? } = import! std.test
///
/// seq assert_eq (to_string_pretty "string") (Ok r#""string""#)
///
/// let expected = r#"[
/// 1,
/// 2,
/// 3
/// ]"#
/// seq assert_eq (to_string_pretty [1, 2, 3]) (Ok expected)
///
/// let expected = r#"{
/// "field": 1
/// }"#
/// assert_eq (to_string_pretty (singleton "field" 1)) (Ok expected)
/// ```
let to_string_pretty v : [Serialize a] -> a -> Result Error String =
do value = serialize v
prim.serialize_pretty value
let serialize_unit : Serialize () = { serialize = \_ -> Ok Null }
let serialize_int : Serialize Int = { serialize = \i -> Ok (Int i) }
let serialize_bool : Serialize Bool = { serialize = \i -> Ok (Bool i) }
let serialize_float : Serialize Float = { serialize = \i -> Ok (Float i) }
let serialize_string : Serialize String = { serialize = \i -> Ok (String i) }
let serialize_option : [Serialize a] -> Serialize (Option a) =
let serialize = \i ->
match i with
| Some x -> serialize x
| None -> Ok Null
{ serialize }
let serialize_array : [Serialize a] -> Serialize (Array a) =
let serialize = \i ->
map Array (for i serialize)
{ serialize }
let serialize_map : [Serialize a] -> Serialize (Map String a) =
let serialize = \i ->
map Object (for i serialize)
{ serialize }
let serialize_value : Serialize Value = { serialize = Ok }
{
Value,
ValueSerializer,
Serialize,
Error,
serialize,
to_string,
to_string_pretty,
serialize_unit,
serialize_int,
serialize_bool,
serialize_float,
serialize_string,
serialize_option,
serialize_array,
serialize_map,
serialize_value,
}