Safe Haskell | None |
---|---|
Language | Haskell2010 |
Generate XML-isomorphic types from declarative descriptions.
There are two kinds of XML-isomorphic types: enumerations and records.
Enumerations are simple enum-types generated via Data.THGen.Enum
plus a FromContent
instance and a ToXML
instance which are derived
from Read
and Show
. Records are a bit more complicated: to define
a record you need to supply its name, a prefix for fields, and a list
of field descriptions. A field description contains the XML tag name
and repetition kind (mandatory, optional, repeated or multiplied).
The repetition kind determines both the parsing strategy and the wrapper around the field type:
a
for mandatory fieldsMaybe a
for optional fields[a]
for repeated fieldsNonEmpty a
for multiplied fields
Example 1.
"Color" =:= enum & "R" & "G" & "B"
produces
data XmlColor = XmlColorR | XmlColorG | XmlColorB | UnknownXmlColor String
with a FromContent
instance that expects the current element content
to be either R
, G
or B
.
Example 2.
"Message" =:= record ! "author" + "recipient" ? "message" [t|Text|] * "attachement"
produces
data Message = Message { _mAuthor :: Author , _mRecipient :: NonEmpty Recipient , _mMessage :: Maybe Text , _mAttachement :: [Attachement] } deriving (...)
with a corresponding FromDom
instance. Lenses are generated
automatically as well.
The examples above also demonstrate that to define the declarative descriptions of data types we provide a terse and convenient EDSL.
To define an enumeration, use the enum
function followed by the name
of the data type to be generated. You can optionally specify if the
enumeration is exhaustive (contains only the listed constructors) or
non-exhaustive (also contains a constructor for unknown values; this
is the default):
"Enum1" Exhaustive =:= enum ...
"Enum2" NonExhaustive =:= enum ...
To define a record, use the record
function followed by the name of
the data type to be generated. The prefix for the record fields is
inferred automatically by taking all of the uppercase letters in the
name. You can override it manually like so:
"Reference" "ref" =:= record ...
To describe a record field you must supply its name as it appears in the XML tag, prefixed by its repetition kind:
!
for mandatory fields?
for optional fields*
for repeated fields+
for multiplied fields
The type of the field is inferred automatically from its name, so
if the field is called "author"
its type will be Author
. You can
override the type by specifying it in quasiquotes like so:
"Message" =:= record ! "author" [t|Person|] ...
- data Exhaustiveness
- data PrefixName = PrefixName String String
- data ExhaustivenessName = ExhaustivenessName String Exhaustiveness
- record :: IsoXmlDescRecord
- enum :: IsoXmlDescEnum
- (!) :: IsoXmlDescRecord -> IsoXmlDescPreField -> IsoXmlDescRecord
- (?) :: IsoXmlDescRecord -> IsoXmlDescPreField -> IsoXmlDescRecord
- (*) :: IsoXmlDescRecord -> IsoXmlDescPreField -> IsoXmlDescRecord
- (+) :: IsoXmlDescRecord -> IsoXmlDescPreField -> IsoXmlDescRecord
- (!%) :: IsoXmlDescRecord -> IsoXmlDescPreAttribute -> IsoXmlDescRecord
- (?%) :: IsoXmlDescRecord -> IsoXmlDescPreAttribute -> IsoXmlDescRecord
- (&) :: IsoXmlDescEnum -> IsoXmlDescEnumCon -> IsoXmlDescEnum
- (=:=) :: Description name desc => name -> desc -> DecsQ
- data Text :: *
- data Int :: *
- data Integer :: *
Documentation
data Exhaustiveness Source #
data PrefixName Source #
IsString PrefixName Source # | |
(~) * s String => IsString (s -> PrefixName) Source # | |
data ExhaustivenessName Source #
IsString ExhaustivenessName Source # | |
(~) * e Exhaustiveness => IsString (e -> ExhaustivenessName) Source # | |
A space efficient, packed, unboxed Unicode text type.
A fixed-precision integer type with at least the range [-2^29 .. 2^29-1]
.
The exact range for a given implementation can be determined by using
minBound
and maxBound
from the Bounded
class.
Bounded Int | Since: 2.1 |
Enum Int | Since: 2.1 |
Eq Int | |
Integral Int | Since: 2.0.1 |
Num Int | Since: 2.1 |
Ord Int | |
Read Int | Since: 2.1 |
Real Int | Since: 2.0.1 |
Show Int | Since: 2.1 |
Lift Int | |
Arbitrary Int | |
CoArbitrary Int | |
NFData Int | |
FromAttribute Int | |
FromDom Int | |
ToXML Int | |
ToXmlAttribute Int Source # | |
Generic1 k (URec k Int) | |
Reifies * Z Int | |
Reifies * n Int => Reifies * (D n) Int | |
Reifies * n Int => Reifies * (SD n) Int | |
Reifies * n Int => Reifies * (PD n) Int | |
Functor (URec * Int) | |
Foldable (URec * Int) | |
Traversable (URec * Int) | |
Eq (URec k Int p) | |
Ord (URec k Int p) | |
Show (URec k Int p) | |
Generic (URec k Int p) | |
data URec k Int | Used for marking occurrences of Since: 4.9.0.0 |
type Rep1 k (URec k Int) | |
type Rep (URec k Int p) | |
Invariant: Jn#
and Jp#
are used iff value doesn't fit in S#
Useful properties resulting from the invariants:
Enum Integer | Since: 2.1 |
Eq Integer | |
Integral Integer | Since: 2.0.1 |
Num Integer | Since: 2.1 |
Ord Integer | |
Read Integer | Since: 2.1 |
Real Integer | Since: 2.0.1 |
Show Integer | Since: 2.1 |
Lift Integer | |
Arbitrary Integer | |
CoArbitrary Integer | |
NFData Integer | |
FromAttribute Integer | |
FromDom Integer | |
ToXML Integer | |
ToXmlAttribute Integer Source # | |
KnownNat n => Reifies Nat n Integer | |