Data.Codec.JSON.Common
- Package
- purescript-codec-json
- Repository
- garyb/purescript-codec-json
#nonEmptyString Source
nonEmptyString :: Codec NonEmptyStringA codec for NonEmptyString values.
Encodes as the standard type in JSON, but will fail to decode if the string is empty.
#nonEmptyArray Source
nonEmptyArray :: forall a. Codec a -> Codec (NonEmptyArray a)A codec for NonEmptyArray values.
Encodes as the standard type in JSON, but will fail to decode if the array is empty.
#nonEmptyList Source
nonEmptyList :: forall a. Codec a -> Codec (NonEmptyList a)A codec for NonEmptyList values.
Encodes as an array in JSON.
#nonEmptySet Source
nonEmptySet :: forall a. Ord a => Codec a -> Codec (NonEmptySet a)A codec for NonEmptySet values.
Encodes as an array in JSON.
#foreignObject Source
foreignObject :: forall a. Codec a -> Codec (Object a)A codec for Object values.
Encodes as an array of two-element key/value arrays in JSON.
Re-exports from Data.Codec.JSON
#IndexedCodec Source
type IndexedCodec a = Codec (Except DecodeError) JArray (List JSON) a aCodec type for specifically indexed JArray elements.
#DecodeError Source
newtype DecodeErrorType for failures while decoding, a path to the point in the JSON that failure occurred, a message describing the problem, and a list of further causes for the failure.
Constructors
Instances
#recordPropOptional Source
recordPropOptional :: forall p a r r'. IsSymbol p => Cons p (Maybe a) r r' => Proxy p -> Codec a -> PropCodec (Record r) -> PropCodec (Record r')Used with record to define an optional field.
This will only decode the property as Nothing if the field does not exist
in the object - having a values such as null assigned will need handling
separately.
The property will be omitted when encoding and the value is Nothing.
#record Source
record :: PropCodec (Record ())The starting value for a object-record codec. Used with recordProp it
provides a convenient method for defining codecs for record types that
encode into JSON objects of the same shape.
For example, to encode a record as the JSON object
{ "name": "Karl", "age": 25 } we would define a codec like this:
import Data.Codec.JSON as CJ
import Type.Proxy (Proxy(..))
type Person = { name ∷ String, age ∷ Int }
codecPerson ∷ CJ.Codec Person
codecPerson =
CJ.object $ CJ.record
# CJ.recordProp (Proxy :: _ "name") CJ.string
# CJ.recordProp (Proxy :: _ "age") CJ.int
See also Data.Codec.JSON.Record.object for a more commonly useful
version of this function.
#prismaticCodec Source
prismaticCodec :: forall a b. String -> (a -> Maybe b) -> (b -> a) -> Codec a -> Codec bAdapts an existing codec with a pair of functions to allow a value to be
further refined. If the inner decoder fails an UnexpectedValue error will
be raised for JSON input.
This function is named as such as the pair of functions it accepts
correspond with the preview and review functions of a Prism-style lens.
An example of this would be a codec for Data.String.NonEmpty.NonEmptyString:
nonEmptyString ∷ CJ.Codec NES.NonEmptyString
nonEmptyString = CJ.prismaticCodec "NonEmptyString" NES.fromString NES.toString CJ.string
Another example might be to handle a mapping from a small sum type to strings:
data Direction = North | South | West | East
directionCodec :: Codec Direction
directionCodec = CJ.prismaticCodec "Direction" dec enc string
where
dec = case _ of
"N" -> Just North
"S" -> Just South
"W" -> Just West
"E" -> Just East
_ -> Nothing
enc = case _ of
North -> "N"
South -> "S"
West -> "W"
East -> "E"
Although for this latter case there are some other options too, in the form
of Data.Codec.JSON.Generic.nullarySum and Data.Codec.JSON.Sum.enumSum.
#nullable Source
nullable :: forall a. Codec a -> Codec (Maybe a)A codec for JSON values that can be null or some other value.
This should not be used if an accurate representation of nested Maybe values is required, as
values like Just Nothing cannot be encoded. For nested Maybes consider using
Data.Codec.JSON.Common.maybe instead.
#indexedArray Source
indexedArray :: forall a. IndexedCodec a -> Codec aA codec for types that are encoded as an array with a specific layout.
For example, if we'd like to encode a Person as a 2-element array, like
["Rashida", 37], we could write the following codec:
import Data.Codec.JSON ((~))
import Data.Codec.JSON as CJ
type Person = { name ∷ String, age ∷ Int }
codecPerson ∷ CJ.Codec Person
codecPerson = CJ.indexedArray $
{ name: _, age: _ }
<$> _.name ~ CJ.index 0 CJ.string
<*> _.age ~ CJ.index 1 CJ.int
#index Source
index :: forall a. Int -> Codec a -> IndexedCodec aA codec for an item in an indexedArray.
#identity Source
identity :: forall m a. Applicative m => Codec m a a a a#encode Source
encode :: forall a b c d. Codec (Except DecodeError) a b c d -> c -> bEncodes a value as JSON using the specified code.
#decode Source
decode :: forall a b c d. Codec (Except DecodeError) a b c d -> a -> Either DecodeError dTries to decode JSON to a value using the specified code.
#(~) Source
Operator alias for Data.Profunctor.lcmap (left-associative / precedence 5)
Codec is defined as a Profunctor so that lcmap can be used to target
specific fields when defining a codec for a product type. This operator
is a convenience for that:
tupleCodec =
Tuple
<$> fst ~ fstCodec
<*> snd ~ sndCodec
Re-exports from Data.Codec.JSON.Sum
#taggedSum Source
taggedSum :: forall tag a. String -> (tag -> String) -> (String -> Maybe tag) -> (tag -> Either a (JSON -> Either DecodeError a)) -> (a -> Tuple tag (Maybe JSON)) -> Codec aA helper for defining JSON codecs for sum types. To ensure exhaustivity there needs to be a mapping to and from a tag type for the type to be encoded.
- The first argument is the name of the type being decoded, for error message purposes.
- The second argument maps a tag value to a string to use in the encoding.
- The third argument maps a string back to a tag value during decoding.
- The fourth argument returns either a constant value or a decoder function based on a tag value.
- The fifth argument returns a tag value and optional encoded value to store for a constructor of the sum.