gluon 0.18.2

A static, type inferred programming language for application embedding
Documentation
//! 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,
}