Module

Codec.Json.Bidirectional.Value

Package
purescript-json-codecs
Repository
jordanmartinez/purescript-json-codecs

Codecs in this module follow a naming convention:

  • the j prefix indicates a primitive JSON codec (e.g. null, number, boolean, string, array, and object)
  • the type's name is used to refer to the codec for that type except in two cases:
    • when the name clashes with a commonly used function/value, the Codec suffix is added:
      • identity for Identity becomes identityCodec
      • void for Void becomes voidCodec
      • map for Map becomes mapCodec
    • when a buildler-like API is needed, the Prim suffix is added
      • object and objectPrim
      • record and recordPrim
      • variant and variantPrim

#json Source

json :: forall e extra. JsonCodec e extra Json

#voidCodec Source

voidCodec :: forall e extra. JsonCodec e extra Void

#jnull Source

jnull :: forall e extra. JsonCodec e extra Unit

#unitCodec Source

unitCodec :: forall e extra. JsonCodec e extra Unit

#boolean Source

boolean :: forall e extra. JsonCodec e extra Boolean

#number Source

number :: forall e extra. JsonCodec e extra Number

#int Source

int :: forall e extra. JsonCodec e extra Int

#char Source

char :: forall e extra. JsonCodec e extra Char

#codePoint Source

codePoint :: forall e extra. JsonCodec e extra CodePoint

#string Source

string :: forall e extra. JsonCodec e extra String

#nonEmptyString Source

nonEmptyString :: forall e extra. JsonCodec e extra NonEmptyString

#jarray Source

jarray :: forall e extra. JsonCodec e extra (Array Json)

#indexedArray Source

indexedArray :: forall e extra a. JIndexedCodec e extra a -> JsonCodec e extra a

#index Source

index :: forall e extra a. Int -> JsonCodec e extra a -> JIndexedCodec e extra a

#array Source

array :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (Array a)

#nonEmptyArray Source

nonEmptyArray :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (NonEmptyArray a)

#jobject Source

jobject :: forall e extra. JsonCodec e extra (Object Json)

#objectPrim Source

objectPrim :: forall e extra a. JPropCodec e extra a -> JsonCodec e extra a

#fieldRequired Source

fieldRequired :: forall e extra a. String -> JsonCodec e extra a -> JPropCodec e extra a

#fieldOptional Source

fieldOptional :: forall e extra a. String -> JsonCodec e extra a -> JPropCodec e extra (Maybe a)

#object Source

object :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (Object a)

#record Source

record :: forall e extra rl codecs to. RowToList codecs rl => InsertRequiredPropCodecs e extra rl codecs () to => Record codecs -> JsonCodec e extra (Record to)

Codec for records where all fields are required and the JSON object's order of fields doesn't matter when using this codec to encode a value to JSON. If some fields are optional or the order matters, see recordPrim.

record
  { requiredFieldName1: pje $ string
  , requiredFieldName2: pje $ array int
  }

#recordPrim Source

recordPrim :: forall e extra rows. (JPropCodec e extra (Record ()) -> JPropCodec e extra (Record rows)) -> JsonCodec e extra (Record rows)

Codec builder for records where the field order matters when encoding JSON, and the underlying JSON object may contain optional fields. If order doesn't matter and all fields are required, see record.

-- Order of fields is based on alphabetical ordering of labels
recordPrim $
  requiredProps
    { requiredFieldName1: pje $ string
    , requiredFieldName2: pje $ array int
    }
  >>> optionalProps
    { optionalFieldName1: pje $ string
    , optionalFieldName2: pje $ array int
    }

-- Order of fields is based on order below
recordPrim $
  requiredProp (Proxy :: _ "requiredFieldName1") (pje $ string)
  >>> optionalProp (Proxy :: _ "optionalFieldName2") (pje $ array int)
  >>> optionalProp (Proxy :: _ "optionalFieldName1") (pje $ string)
  >>> requiredProp (Proxy :: _ "requiredFieldName2") (pje $ array int)

#requiredProp Source

requiredProp :: forall e extra sym a r r'. IsSymbol sym => Cons sym a r r' => Proxy sym -> JsonCodec e extra a -> JPropCodec e extra (Record r) -> JPropCodec e extra (Record r')

See recordPrim

#requiredProps Source

requiredProps :: forall e extra rl codecs from to. RowToList codecs rl => InsertRequiredPropCodecs e extra rl codecs from to => Record codecs -> (JPropCodec e extra (Record from) -> JPropCodec e extra (Record to))

See recordPrim

#optionalProp Source

optionalProp :: forall e extra sym a r r'. IsSymbol sym => Cons sym (Maybe a) r r' => Proxy sym -> JsonCodec e extra a -> JPropCodec e extra (Record r) -> JPropCodec e extra (Record r')

See recordPrim

#optionalProps Source

optionalProps :: forall e extra rl codecs from to. RowToList codecs rl => InsertOptionalPropCodecs e extra rl codecs from to => Record codecs -> (JPropCodec e extra (Record from) -> JPropCodec e extra (Record to))

See recordPrim

#variant Source

variant :: forall e extra rows rl out. RowToList rows rl => VariantJsonCodec e extra rl rows out => DecodeErrorAccumulatorFn e extra (Object Json) (Variant out) -> Record rows -> JsonCodec e extra (Variant out)

Codec for Variant where the order of the handlers (e.g. which tag is checked first) does not matter. If that is not the case, see variantPrim.

variant
  { tag1: pje $ string
  , tag2: pje $ array int
  }

#variantPrim Source

variantPrim :: forall e extra rows. DecodeErrorAccumulatorFn e extra (Object Json) (Variant rows) -> ((DecodeErrorAccumulatorFn e extra (Object Json) (Variant ()) -> JsonCodec' e extra (Object Json) (Variant ())) -> (DecodeErrorAccumulatorFn e extra (Object Json) (Variant rows) -> JsonCodec' e extra (Object Json) (Variant rows))) -> JsonCodec e extra (Variant rows)

Codec for Variant where the order of the handlers (e.g. which tag is checked first) DOES matter. If that is not the case and you want simpler syntax, see variant.

variantPrim $
  variantCase (Proxy :: _ "tag2") (Tuple (addCtorHintC "SomeCtorWithArg") $ Right $ pje $ array int)
  >>> variantCase (Proxy :: _ "tag1") (Tuple (addCtorHintC "SomeCtorNoArg") $ Left unit)

#variantCase Source

variantCase :: forall e extra sym a tail row. IsSymbol sym => Cons sym a tail row => Proxy sym -> Tuple (JsonCodec' e extra (Object Json) (Variant row) -> JsonCodec' e extra (Object Json) (Variant row)) (Either a (JsonCodec e extra a)) -> ((DecodeErrorAccumulatorFn e extra (Object Json) (Variant tail) -> JsonCodec' e extra (Object Json) (Variant tail)) -> (DecodeErrorAccumulatorFn e extra (Object Json) (Variant row) -> JsonCodec' e extra (Object Json) (Variant row)))

See variantPrim.

#nullable Source

nullable :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (Nullable a)

#identityCodec Source

identityCodec :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (Identity a)

#maybe Source

maybe :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (Maybe a)

#either Source

either :: forall e extra a b. JsonCodec e extra a -> JsonCodec e extra b -> JsonCodec e extra (Either a b)

#tuple Source

tuple :: forall e extra a b. JsonCodec e extra a -> JsonCodec e extra b -> JsonCodec e extra (Tuple a b)

#these Source

these :: forall e extra a b. JsonCodec e extra a -> JsonCodec e extra b -> JsonCodec e extra (These a b)

#nonEmpty Source

nonEmpty :: forall e extra f a. JsonCodec e extra a -> (JsonCodec e extra a -> JsonCodec e extra (f a)) -> JsonCodec e extra (NonEmpty f a)

Slightly simpler version of nonEmpty'. Rather than writing, nonEmpty' int (array int), one can use this function and just write nonEmpty int array.

#nonEmpty' Source

nonEmpty' :: forall e extra f a. JsonCodec e extra a -> JsonCodec e extra (f a) -> JsonCodec e extra (NonEmpty f a)

Slightly more verbose version of nonEmpty.

#list Source

list :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (List a)

#nonEmptyList Source

nonEmptyList :: forall e extra a. JsonCodec e extra a -> JsonCodec e extra (NonEmptyList a)

#mapCodec Source

mapCodec :: forall e extra k v. Ord k => JsonCodec e extra k -> JsonCodec e extra v -> JsonCodec e extra (Map k v)

#set Source

set :: forall e extra a. Ord a => JsonCodec e extra a -> JsonCodec e extra (Set a)

#nonEmptySet Source

nonEmptySet :: forall e extra a. Ord a => JsonCodec e extra a -> JsonCodec e extra (NonEmptySet a)

#fix Source

fix :: forall e extra a. (JsonCodec e extra a -> JsonCodec e extra a) -> JsonCodec e extra a

#RlJCodec Source

newtype RlJCodec :: Type -> Type -> RowList Type -> Row Type -> Typenewtype RlJCodec e extra rl row

#InsertRequiredPropCodecs Source

class InsertRequiredPropCodecs :: Type -> Type -> RowList Type -> Row Type -> Row Type -> Row Type -> Constraintclass InsertRequiredPropCodecs e extra rl codecs from to | e extra rl -> codecs from to where

Members

Instances

#InsertOptionalPropCodecs Source

class InsertOptionalPropCodecs :: Type -> Type -> RowList Type -> Row Type -> Row Type -> Row Type -> Constraintclass InsertOptionalPropCodecs e extra rl codecs from to | e extra rl -> codecs from to where

Members

Instances

#RlRecord Source

newtype RlRecord :: Type -> Type -> RowList Type -> Row Type -> Typenewtype RlRecord e extra rowlist rows

#VariantJsonCodec Source

class VariantJsonCodec :: Type -> Type -> RowList Type -> Row Type -> Row Type -> Constraintclass VariantJsonCodec e extra rowlist row out | e extra rowlist -> row out where

Members

Instances