@@ -5,7 +5,7 @@
5module Data.THGen.XML.Internal where
5module Data.THGen.XML.Internal where
7import Control.DeepSeq
7import Control.DeepSeq
8−import Control.Lens hiding (repeated, enum, (&), Strict)
8+import Control.Lens hiding (repeated, enum, (&))
9import Control.Lens.Internal.FieldTH (makeFieldOpticsForDec)
9import Control.Lens.Internal.FieldTH (makeFieldOpticsForDec)
10import qualified Data.Char as C
10import qualified Data.Char as C
11import Data.List.NonEmpty (NonEmpty)
11import Data.List.NonEmpty (NonEmpty)
@@ -15,7 +15,7 @@ import Data.THGen.Compat as THC
15import Data.THGen.Enum
15import Data.THGen.Enum
16import qualified Data.Text as T
16import qualified Data.Text as T
17import GHC.Generics (Generic)
17import GHC.Generics (Generic)
18−import Language.Haskell.TH as TH hiding (Strict)
18+import Language.Haskell.TH as TH
19import Prelude hiding ((+), (*), (^))
19import Prelude hiding ((+), (*), (^))
20import qualified Text.XML as X
20import qualified Text.XML as X
21import Text.XML.DOM.Parser hiding (parseContent)
21import Text.XML.DOM.Parser hiding (parseContent)
@@ -23,22 +23,8 @@ import Text.XML.DOM.Parser.Internal.Content
23import Text.XML.ParentAttributes
23import Text.XML.ParentAttributes
24import qualified Text.XML.Writer as XW
24import qualified Text.XML.Writer as XW
30−data GenType
27+data GenType = Parser | Generator | Both
35− | LenientParserAndGenerator
37−isLenientType :: GenType -> Bool
39− LenientParser -> True
40− LenientParserAndGenerator -> True
43data XmlFieldPlural
29data XmlFieldPlural
44 = XmlFieldPluralMandatory -- Occurs exactly 1 time (Identity)
30 = XmlFieldPluralMandatory -- Occurs exactly 1 time (Identity)
@@ -160,7 +146,7 @@ instance Description ExhaustivenessName IsoXmlDescEnum where
160 exhaustivenessName =:= (IsoXmlDescEnum genType descEnumCons) =
146 exhaustivenessName =:= (IsoXmlDescEnum genType descEnumCons) =
161 isoXmlGenerateEnum genType exhaustivenessName (reverse descEnumCons)
147 isoXmlGenerateEnum genType exhaustivenessName (reverse descEnumCons)
163−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreField) where
149+instance IsString (TH.TypeQ -> IsoXmlDescPreField) where
164 fromString = IsoXmlDescPreField
150 fromString = IsoXmlDescPreField
166instance IsString IsoXmlDescPreField where
152instance IsString IsoXmlDescPreField where
@@ -168,10 +154,10 @@ instance IsString IsoXmlDescPreField where
169 ty = (TH.conT . TH.mkName) ("Xml" ++ over _head C.toUpper (xmlLocalName name))
155 ty = (TH.conT . TH.mkName) ("Xml" ++ over _head C.toUpper (xmlLocalName name))
171−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreAttribute) where
157+instance IsString (TH.TypeQ -> IsoXmlDescPreAttribute) where
172 fromString = IsoXmlDescPreAttribute
158 fromString = IsoXmlDescPreAttribute
174−instance (m ~ Q) => IsString (m Type -> IsoXmlDescPreContent) where
160+instance IsString (TH.TypeQ -> IsoXmlDescPreContent) where
175 fromString = IsoXmlDescPreContent
161 fromString = IsoXmlDescPreContent
177instance IsString IsoXmlDescPreAttribute where
163instance IsString IsoXmlDescPreAttribute where
@@ -225,14 +211,11 @@ isoXmlGenerateEnum genType (ExhaustivenessName strName' exh) enumCons = do
225 (return [])
211 (return [])
226 [t|ToXmlAttribute $(TH.conT name)|]
212 [t|ToXmlAttribute $(TH.conT name)|]
227 [funSimple 'toXmlAttribute [e|T.pack . show|]]
213 [funSimple 'toXmlAttribute [e|T.pack . show|]]
228− genFromDomInst mode = do
214+ genFromDomInst = do
229 TH.instanceD
215 TH.instanceD
230 (return [])
216 (return [])
231 [t|FromDom $(TH.conT name)|]
217 [t|FromDom $(TH.conT name)|]
233− Strict -> funSimple 'fromDom [e|parseContent readContent|]
234− Lenient -> funSimple 'fromDom [e|ignoreBlank $ parseContent readContent|]
218+ [funSimple 'fromDom [e|parseContent readContent|]]
236 genFromAttributeInst = do
219 genFromAttributeInst = do
237 TH.instanceD
220 TH.instanceD
238 (return [])
221 (return [])
@@ -244,24 +227,13 @@ isoXmlGenerateEnum genType (ExhaustivenessName strName' exh) enumCons = do
244 toXmlAttributeInst <- genToXmlAttributeInst
227 toXmlAttributeInst <- genToXmlAttributeInst
245 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst]
228 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst]
246 Parser -> do
229 Parser -> do
247− fromDomInst <- genFromDomInst Strict
230+ fromDomInst <- genFromDomInst
248− fromAttributeInst <- genFromAttributeInst
249− return $ enumDecls ++ [fromDomInst, fromAttributeInst]
251− fromDomInst <- genFromDomInst Lenient
252 fromAttributeInst <- genFromAttributeInst
231 fromAttributeInst <- genFromAttributeInst
253 return $ enumDecls ++ [fromDomInst, fromAttributeInst]
232 return $ enumDecls ++ [fromDomInst, fromAttributeInst]
254− ParserAndGenerator -> do
233+ Both -> do
255− toXmlInst <- genToXmlInst
256− toXmlAttributeInst <- genToXmlAttributeInst
257− fromDomInst <- genFromDomInst Strict
258− fromAttributeInst <- genFromAttributeInst
259− return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
260− fromDomInst, fromAttributeInst]
261− LenientParserAndGenerator -> do
262 toXmlInst <- genToXmlInst
234 toXmlInst <- genToXmlInst
263 toXmlAttributeInst <- genToXmlAttributeInst
235 toXmlAttributeInst <- genToXmlAttributeInst
264− fromDomInst <- genFromDomInst Lenient
236+ fromDomInst <- genFromDomInst
265 fromAttributeInst <- genFromAttributeInst
237 fromAttributeInst <- genFromAttributeInst
266 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
238 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
267 fromDomInst, fromAttributeInst]
239 fromDomInst, fromAttributeInst]
@@ -284,14 +256,11 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
284 IsoXmlDescField fieldPlural rawName fieldType = descField
256 IsoXmlDescField fieldPlural rawName fieldType = descField
285 fieldStrName = xmlLocalName rawName
257 fieldStrName = xmlLocalName rawName
286 fName = TH.mkName (fieldName fieldStrName)
258 fName = TH.mkName (fieldName fieldStrName)
287− fType' = case fieldPlural of
259+ fType = case fieldPlural of
288 XmlFieldPluralMandatory -> fieldType
260 XmlFieldPluralMandatory -> fieldType
289 XmlFieldPluralOptional -> [t| Maybe $fieldType |]
261 XmlFieldPluralOptional -> [t| Maybe $fieldType |]
290 XmlFieldPluralRepeated -> [t| [$fieldType] |]
262 XmlFieldPluralRepeated -> [t| [$fieldType] |]
291 XmlFieldPluralMultiplied -> [t| NonEmpty $fieldType |]
263 XmlFieldPluralMultiplied -> [t| NonEmpty $fieldType |]
292− fType = if isLenientType genType
293− then [t| Maybe $fType' |]
295 in if isNewtype
264 in if isNewtype
296 then THC.varStrictType fName (THC.nonStrictType fType)
265 then THC.varStrictType fName (THC.nonStrictType fType)
297 else THC.varStrictType fName (THC.strictType fType)
266 else THC.varStrictType fName (THC.strictType fType)
@@ -326,7 +295,7 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
329− genFromDomInst mode = do
298+ genFromDomInst = do
331 exprHeader = [e|pure $(TH.conE name)|]
300 exprHeader = [e|pure $(TH.conE name)|]
332 exprRecordParts = do
301 exprRecordParts = do
@@ -340,9 +309,8 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
340 fieldParse = case fieldPlural of
309 fieldParse = case fieldPlural of
341 XmlFieldPluralMandatory -> [e|inElem|]
310 XmlFieldPluralMandatory -> [e|inElem|]
342 _ -> [e|inElemTrav|]
311 _ -> [e|inElemTrav|]
343− in case mode of
312+ in
344− Strict -> [e|$fieldParse $exprFieldStrName fromDom|]
345− Lenient -> [e|$fieldParse $exprFieldStrName (ignoreBlank fromDom)|]
313+ [e|$fieldParse $exprFieldStrName fromDom|]
346 IsoXmlDescRecordAttribute descAttribute ->
314 IsoXmlDescRecordAttribute descAttribute ->
348 IsoXmlDescAttribute attributePlural attributeStrName _ = descAttribute
316 IsoXmlDescAttribute attributePlural attributeStrName _ = descAttribute
@@ -428,21 +396,12 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
428 return $ [termDecl] ++ lensDecls ++
396 return $ [termDecl] ++ lensDecls ++
429 [toXmlInst, toXmlParentAttributesInst, nfDataInst]
397 [toXmlInst, toXmlParentAttributesInst, nfDataInst]
430 Parser -> do
398 Parser -> do
431− fromDomInst <- genFromDomInst Strict
399+ fromDomInst <- genFromDomInst
432 return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
400 return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
433− LenientParser -> do
401+ Both -> do
434− fromDomInst <- genFromDomInst Lenient
435− return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
436− ParserAndGenerator -> do
437− toXmlInst <- genToXmlInst
438− toXmlParentAttributesInst <- genToXmlParentAttributeInst
439− fromDomInst <- genFromDomInst Strict
440− return $ [termDecl] ++ lensDecls ++
441− [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
442− LenientParserAndGenerator -> do
443 toXmlInst <- genToXmlInst
402 toXmlInst <- genToXmlInst
444 toXmlParentAttributesInst <- genToXmlParentAttributeInst
403 toXmlParentAttributesInst <- genToXmlParentAttributeInst
445− fromDomInst <- genFromDomInst Lenient
404+ fromDomInst <- genFromDomInst
446 return $ [termDecl] ++ lensDecls ++
405 return $ [termDecl] ++ lensDecls ++
447 [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
406 [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]