tomland-1.3.3.2: src/Toml/Codec.hs
{- |
Module : Toml.Codec
Copyright : (c) 2018-2022 Kowainik
SPDX-License-Identifier : MPL-2.0
Maintainer : Kowainik <xrom.xkov@gmail.com>
Stability : Stable
Portability : Portable
This module provides utilities for implementing and using
bidirectional TOML codecs. The concept of bidirectional conversion in
@tomland@ has two parts: __'TomlBiMap'__ and __'TomlCodec'__.
== General TOML description
In the following TOML
@
name = "foo"
@
we call @name@ as __key__ and @"foo"@ as __value__.
== 'TomlBiMap'
'TomlBiMap' provides a bidirectional conversion between
__TOML values__ and Haskell primitive values. TOML specification
defines some primitive values you can use in key-value pairs
(e.g. /integer/, /string/, /local time/). 'TomlBiMap' provides a way
to convert between TOML primitives and Haskell values. 'TomlBiMap'
doesn't know anything about TOML keys.
== 'TomlCodec'
'TomlCodec' describes how to convert in both ways between a single or
multiple key-value pairs and Haskell types. @tomland@ provides basic
primitives for decoding and encoding single key-value pairs, but also
a way to compose multiple 'TomlCodec's into a single one. So, if you
have a custom data type, that has several fields or several
constructors, you need to define 'TomlCodec' for your data type.
== Encoding and decoding
If you have a type like @User@ then @userCodec :: 'TomlCodec' User@ is
an object that describes how to 'encode' a value of type @User@ to
TOML and 'decode' TOML to a value of type @User@.
* To TOML: @'encode' userCodec someUser@
* From TOML: @'decode' userCodec someToml@
== Naming conventions
@tomland@ uses the following naming conventions (and encourages
library users to follow them as well):
* __\_SomeName__: for 'TomlBiMap' (e.g. '_Int', '_Text', '_Array')
* __someName__: for basic 'TomlCodec's (e.g. 'int', 'text', 'arrayOf')
* __someNameCodec__: for user defined codecs for custom types (e.g. @userCodec@, @configCodec@, @serverCodec@)
@since 1.3.0.0
-}
module Toml.Codec
( -- $types
module Toml.Codec.Types
-- $error
, module Toml.Codec.Error
-- $code
, module Toml.Codec.Code
-- $di
, module Toml.Codec.Di
-- $combinator
, module Toml.Codec.Combinator
-- $generic
, module Toml.Codec.Generic
-- $bimap
, module Toml.Codec.BiMap
-- $bimapConversion
, module Toml.Codec.BiMap.Conversion
) where
import Toml.Codec.BiMap
import Toml.Codec.BiMap.Conversion
import Toml.Codec.Code
import Toml.Codec.Combinator
import Toml.Codec.Di
import Toml.Codec.Error
import Toml.Codec.Generic
import Toml.Codec.Types
{- $types
Core codec types, including @Toml@ specialised ones: 'TomlCodec', 'TomlState'
and 'TomlEnv'.
-}
{- $error
Core error types, including 'TomlDecodeError' and 'LoadTomlException'.
-}
{- $code
Contains TOML-specific combinators for converting between TOML and user data
types.
-}
{- $di
Forward and backward mapping functions and combinators (similar to profunctors).
-}
{- $combinator
Contains TOML-specific combinators and codecs for converting between TOML and
user data types.
-}
{- $generic
Automatic TOML codecs using 'GHC.Generics.Generic'.
-}
{- $bimap
'BiMap' type that represents /Tagged Partial Bidirectional Conversion/
between TOML primitives and Haskell types.
-}
{- $bimapConversion
Specific implementations of 'BiMap' between Haskell types and TOML
values.
-}