genericDecode :: forall a rep. Generic a rep => GenericDecode rep => Options -> Foreign -> F aRead a value which has a Generic type.
genericEncode :: forall a rep. Generic a rep => GenericEncode rep => Options -> a -> ForeignGenerate a Foreign value compatible with the genericDecode function.
decodeJSON :: forall a. Decode a => String -> F aDecode a JSON string using a Decode instance.
encodeJSON :: forall a. Encode a => a -> StringEncode a JSON string using an Encode instance.
genericDecodeJSON :: forall a rep. Generic a rep => GenericDecode rep => Options -> String -> F aRead a value which has a Generic type from a JSON String
genericEncodeJSON :: forall a rep. Generic a rep => GenericEncode rep => Options -> a -> StringWrite a value which has a Generic type as a JSON String
data ForeignError
= ForeignError String
| TypeMismatch String String
| ErrorAtIndex Int ForeignError
| ErrorAtProperty String ForeignErrorA type for foreign type errors
Eq ForeignError
Ord ForeignError
Show ForeignErrordata Foreign :: TypeA type for foreign data.
Foreign data is data from any external unknown or unreliable source, for which it cannot be guaranteed that the runtime representation conforms to that of any particular type.
Suitable applications of Foreign are
- To represent responses from web services
- To integrate with external JavaScript libraries.
type F = Except MultipleErrorsAn error monad, used in this library to encode possible failures when dealing with foreign data.
The Alt instance for Except allows us to accumulate errors,
unlike Either, which preserves only the last error.
data SumEncoding
= TaggedObject { tagFieldName :: String, contentsFieldName :: String, constructorTagTransform :: String -> String }The encoding of sum types for your type.
TaggedObjects will be encoded in the form { [tagFieldName]: "ConstructorTag", [contentsFieldName]: "Contents"}.
constructorTagTransform can be provided to transform the constructor tag to a form you use, e.g. toLower/toUpper.
type Options = { sumEncoding :: SumEncoding, unwrapSingleConstructors :: Boolean, unwrapSingleArguments :: Boolean, fieldTransform :: String -> String }Encoding/Decoding options which can be used to customize
Decode and Encode instances which are derived via
Generic (see genericEncode and genericDecode).
class Decode a where
decode :: Foreign -> F aThe Decode class is used to generate decoding functions
of the form Foreign -> F a using generics-rep deriving.
First, derive Generic for your data:
import Data.Generic.Rep
data MyType = MyType ...
derive instance genericMyType :: Generic MyType _You can then use the genericDecode and genericDecodeJSON functions
to decode your foreign/JSON-encoded data.
Decode Void
Decode Unit
Decode Foreign
Decode String
Decode Char
Decode Boolean
Decode Number
Decode Int
(Decode a) => Decode (Identity a)
(Decode a) => Decode (Array a)
(Decode a) => Decode (Maybe a)
(Decode v) => Decode (Object v)
(RowToList r rl, DecodeRecord r rl) => Decode { | r }class Encode a where
encode :: a -> ForeignThe Encode class is used to generate encoding functions
of the form a -> Foreign using generics-rep deriving.
First, derive Generic for your data:
import Data.Generic.Rep
data MyType = MyType ...
derive instance genericMyType :: Generic MyType _You can then use the genericEncode and genericEncodeJSON functions
to encode your data as JSON.
Encode Void
Encode Unit
Encode Foreign
Encode String
Encode Char
Encode Boolean
Encode Number
Encode Int
(Encode a) => Encode (Identity a)
(Encode a) => Encode (Array a)
(Encode a) => Encode (Maybe a)
(Encode v) => Encode (Object v)
(RowToList r rl, EncodeRecord r rl) => Encode { | r }class GenericDecode a GenericDecode NoConstructors
(IsSymbol name, GenericDecodeArgs rep, GenericCountArgs rep) => GenericDecode (Constructor name rep)
(GenericDecode a, GenericDecode b) => GenericDecode (Sum a b)class GenericEncode a GenericEncode NoConstructors
(IsSymbol name, GenericEncodeArgs rep) => GenericEncode (Constructor name rep)
(GenericEncode a, GenericEncode b) => GenericEncode (Sum a b)defaultOptions :: OptionsDefault decoding/encoding options:
- Represent sum types as records with
tagandcontentsfields - Unwrap single arguments
- Don't unwrap single constructors
- Use the constructor names as-is
- Use the field names as-is