miniBill/elm-codec/1.1.0

NOTE: the latest version is 2.3.1

Codec

A Codec a contain a JSON Decoder a and the corresponding a -> Value encoder.

Definition

type Codec a

A value that knows how to encode and decode JSON values.

type alias Value =
Value

Represents a JavaScript value.

type alias Error =
Error

A structured error describing exactly how the decoder failed. You can use this to create more elaborate visualizations of a decoder problem. For example, you could show the entire JSON object and show the part causing the failure in red.

Decode

type alias Decoder a =
Decoder a

A value that knows how to decode JSON values.

decoder : Codec a -> Decoder a

Extracts the Decoder contained inside the Codec.

decodeString : Codec a -> String -> Result Error a

Parse the given string into a JSON value and then run the Codec on it. This will fail if the string is not well-formed JSON or if the Codec fails for some reason.

decodeValue : Codec a -> Value -> Result Error a

Run a Codec to decode some JSON Value. You can send these JSON values through ports, so that is probably the main time you would use this function.

Encode

encoder : Codec a -> a -> Value

Extracts the encoding function contained inside the Codec.

encodeToString : Int -> Codec a -> a -> String

Convert a value into a prettified JSON string. The first argument specifies the amount of indentation in the result string.

encodeToValue : Codec a -> a -> Value

Convert a value into a Javascript Value.

Primitives

string : Codec String

Codec between a JSON string and an Elm String

bool : Codec Bool

Codec between a JSON boolean and an Elm Bool

int : Codec Int

Codec between a JSON number and an Elm Int

float : Codec Float

Codec between a JSON number and an Elm Float

char : Codec Char

Codec between a JSON string of length 1 and an Elm Char

Data Structures

maybe : Codec a -> Codec (Maybe a)

Represents an optional value.

list : Codec a -> Codec (List a)

Codec between a JSON array and an Elm List.

array : Codec a -> Codec (Array a)

Codec between a JSON array and an Elm Array.

dict : Codec a -> Codec (Dict String a)

Codec between a JSON object and an Elm Dict.

set : Codec comparable -> Codec (Set comparable)

Codec between a JSON array and an Elm Set.

tuple : Codec a -> Codec b -> Codec ( a, b )

Codec between a JSON array of length 2 and an Elm Tuple.

triple : Codec a -> Codec b -> Codec c -> Codec ( a, b, c )

Codec between a JSON array of length 3 and an Elm triple.

result : Codec error -> Codec value -> Codec (Result error value)

Codec for Result values.

Object Primitives

type ObjectCodec a b

A partially built Codec for an object.

object : b -> ObjectCodec a b

Start creating a Codec for an object. You should pass the main constructor as argument. If you don't have one (for example it's a simple type with no name), you should pass a function that given the field values builds an object.

field : String -> (a -> f) -> Codec f -> ObjectCodec a (f -> b) -> ObjectCodec a b

Specify the name getter and Codec for a field.

String
-> (a -> Maybe f)
-> Codec f
-> ObjectCodec a (Maybe f -> b)
-> ObjectCodec a b

Specify the name getter and Codec for an optional field. This is particularly useful for evolving your Codecs.

Create a Codec from a fully specified ObjectCodec.

Custom Types

type CustomCodec match v

A partially built Codec for a custom type.

custom : match -> CustomCodec match value

Starts building a Codec for a custom type. You need to pass a pattern matching function, see the examples and FAQ for details.

variant0 : String -> v -> CustomCodec (Value -> a) v -> CustomCodec a v

Define a variant with 0 parameters for a custom type.

String
-> (a -> v)
-> Codec a
-> CustomCodec ((a -> Value) -> b) v
-> CustomCodec b v

Define a variant with 1 parameters for a custom type.

String
-> (a -> b -> v)
-> Codec a
-> Codec b
-> CustomCodec ((a -> b -> Value) -> c) v
-> CustomCodec c v

Define a variant with 2 parameters for a custom type.

String
-> (a -> b -> c -> v)
-> Codec a
-> Codec b
-> Codec c
-> CustomCodec ((a -> b -> c -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 3 parameters for a custom type.

String
-> (a -> b -> c -> d -> v)
-> Codec a
-> Codec b
-> Codec c
-> Codec d
-> CustomCodec ((a -> b -> c -> d -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 4 parameters for a custom type.

String
-> (a -> b -> c -> d -> e -> v)
-> Codec a
-> Codec b
-> Codec c
-> Codec d
-> Codec e
-> CustomCodec ((a -> b -> c -> d -> e -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 5 parameters for a custom type.

String
-> (a -> b -> c -> d -> e -> f -> v)
-> Codec a
-> Codec b
-> Codec c
-> Codec d
-> Codec e
-> Codec f
-> CustomCodec ((a -> b -> c -> d -> e -> f -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 6 parameters for a custom type.

String
-> (a -> b -> c -> d -> e -> f -> g -> v)
-> Codec a
-> Codec b
-> Codec c
-> Codec d
-> Codec e
-> Codec f
-> Codec g
-> CustomCodec ((a -> b -> c -> d -> e -> f -> g -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 7 parameters for a custom type.

String
-> (a -> b -> c -> d -> e -> f -> g -> h -> v)
-> Codec a
-> Codec b
-> Codec c
-> Codec d
-> Codec e
-> Codec f
-> Codec g
-> Codec h
-> CustomCodec ((a -> b -> c -> d -> e -> f -> g -> h -> Value) -> partial) v
-> CustomCodec partial v

Define a variant with 8 parameters for a custom type.

buildCustom : CustomCodec (a -> Value) a -> Codec a

Build a Codec for a fully specified custom type.

Inconsistent structure

oneOf : Codec a -> List (Codec a) -> Codec a

Try a set of decoders (in order). The first argument is used for encoding and decoding, the list of other codecs is used as a fallback while decoding.

This is particularly useful for backwards compatibility. You would pass the current codec as the first argument, and the old ones (eventually mapped) as a fallback list to use while decoding.

Mapping

map : (a -> b) -> (b -> a) -> Codec a -> Codec b

Transform a Codec.

Fancy Codecs

constant : a -> Codec a

Create a Codec that produces null as JSON and always decodes as the same value.

recursive : (Codec a -> Codec a) -> Codec a

Create a Codec for a recursive data structure. The argument to the function you need to pass is the fully formed Codec.