@@ -25,19 +25,13 @@ import Debug.Trace
25import System.Environment
25import System.Environment
26import System.IO
26import System.IO
27import Text.XSD
27import Text.XSD
30makeNamePrefix :: Text -> Text
32makeNamePrefix :: Text -> Text
31makeNamePrefix = T.map C.toLower . T.filter (\c -> C.isUpper c || C.isDigit c)
33makeNamePrefix = T.map C.toLower . T.filter (\c -> C.isUpper c || C.isDigit c)
33−data GenType = Parser | Generator | Both
34− deriving (Read, Show)
36−genTypeToText :: GenType -> Text
37−genTypeToText Parser = "Parser"
38−genTypeToText Generator = "Generator"
39−genTypeToText Both = "Both"
41type GenMonad = ReaderT DatatypeMap (Writer Text)
35type GenMonad = ReaderT DatatypeMap (Writer Text)
43class Fields a where
37class Fields a where
@@ -245,13 +239,13 @@ tellGen code comment =
245runGen :: DatatypeMap -> GenMonad a -> Text
239runGen :: DatatypeMap -> GenMonad a -> Text
246runGen dm act = execWriter $ runReaderT act dm
240runGen dm act = execWriter $ runReaderT act dm
248−generateIsoXml :: GenType -> XSD -> Text
242+generateIsoXml :: Maybe Header -> ModuleName -> GenType -> XSD -> Text
249−generateIsoXml genType (XSD (e,dm)) =
243+generateIsoXml mHeader name genType xsd@(XSD (e,dm)) =
251 (dList, el) = untwistDeps e dm
245 (dList, el) = untwistDeps e dm
252− in (header genType <>) . runGen dm $ do
246+ in (header mHeader name genType <>) . runGen dm $ do
253− for_ dList $ \(t,dt) ->
247+ for_ dList $ \(t,dt) -> do
254− generateIsoDatatype genType t dt []
248+ generateIsoDatatype genType (Just t) dt []
255 for_ el (generateIsoRecord genType)
249 for_ el (generateIsoRecord genType)
257toQualifier :: Int -> Int -> Text
251toQualifier :: Int -> Int -> Text
@@ -262,9 +256,10 @@ toQualifier minOc maxOc
262 | minOc == 1 && maxOc < minOc = error "maxOccurs < minOccurs"
256 | minOc == 1 && maxOc < minOc = error "maxOccurs < minOccurs"
263 | otherwise = "*"
257 | otherwise = "*"
265−header :: GenType -> Text
259+header :: Maybe Header -> ModuleName -> GenType -> Text
266−header genType = T.unlines $
260+header mHeader name genType = T.unlines $
261+ maybeToList (T.unlines . fmap ("-- " <>) . T.lines <$> mHeader) <>
267− [ "module Dummy where"
262+ [ "module " <> name <> " where"
269 , "import Control.DeepSeq"
264 , "import Control.DeepSeq"
270 , "import Data.THGen.XML"
265 , "import Data.THGen.XML"
@@ -450,10 +445,10 @@ generateIsoField
451main :: IO ()
446main :: IO ()
453− (inFile:mode:_) <- getArgs
448+ Options{..} <- getOptions
454− xml <- BL.readFile inFile
449+ xml <- BL.readFile oInput
456 xsd = case parseXSD def xml of
451 xsd = case parseXSD def xml of
457 Right xsd' -> xsd'
452 Right xsd' -> xsd'
458 Left e -> error $ show e
453 Left e -> error $ show e
459− T.hPutStrLn stdout $ generateIsoXml (read mode) xsd
454+ T.hPutStrLn stdout $ generateIsoXml oHeader oModule oMode xsd