@@ -25,19 +25,13 @@ import Debug.Trace
2525import System.Environment
2626import System.IO
2727import Text.XSD
28+import Options
29+import Data.Maybe
2830
2931
3032makeNamePrefix :: Text -> Text
3133makeNamePrefix = T.map C.toLower . T.filter (\c -> C.isUpper c || C.isDigit c)
3234
33−data GenType = Parser | Generator | Both
34− deriving (Read, Show)
35−
36−genTypeToText :: GenType -> Text
37−genTypeToText Parser = "Parser"
38−genTypeToText Generator = "Generator"
39−genTypeToText Both = "Both"
40−
4135type GenMonad = ReaderT DatatypeMap (Writer Text)
4236
4337class Fields a where
@@ -245,13 +239,13 @@ tellGen code comment =
245239runGen :: DatatypeMap -> GenMonad a -> Text
246240runGen dm act = execWriter $ runReaderT act dm
247241
248−generateIsoXml :: GenType -> XSD -> Text
249−generateIsoXml genType (XSD (e,dm)) =
242+generateIsoXml :: Maybe Header -> ModuleName -> GenType -> XSD -> Text
243+generateIsoXml mHeader name genType xsd@(XSD (e,dm)) =
250244 let
251245 (dList, el) = untwistDeps e dm
252− in (header genType <>) . runGen dm $ do
253− for_ dList $ \(t,dt) ->
254− generateIsoDatatype genType t dt []
246+ in (header mHeader name genType <>) . runGen dm $ do
247+ for_ dList $ \(t,dt) -> do
248+ generateIsoDatatype genType (Just t) dt []
255249 for_ el (generateIsoRecord genType)
256250
257251toQualifier :: Int -> Int -> Text
@@ -262,9 +256,10 @@ toQualifier minOc maxOc
262256 | minOc == 1 && maxOc < minOc = error "maxOccurs < minOccurs"
263257 | otherwise = "*"
264258
265−header :: GenType -> Text
266−header genType = T.unlines $
267− [ "module Dummy where"
259+header :: Maybe Header -> ModuleName -> GenType -> Text
260+header mHeader name genType = T.unlines $
261+ maybeToList (T.unlines . fmap ("-- " <>) . T.lines <$> mHeader) <>
262+ [ "module " <> name <> " where"
268263 , ""
269264 , "import Control.DeepSeq"
270265 , "import Data.THGen.XML"
@@ -450,10 +445,10 @@ generateIsoField
450445
451446main :: IO ()
452447main = do
453− (inFile:mode:_) <- getArgs
454− xml <- BL.readFile inFile
448+ Options{..} <- getOptions
449+ xml <- BL.readFile oInput
455450 let
456451 xsd = case parseXSD def xml of
457452 Right xsd' -> xsd'
458453 Left e -> error $ show e
459− T.hPutStrLn stdout $ generateIsoXml (read mode) xsd
454+ T.hPutStrLn stdout $ generateIsoXml oHeader oModule oMode xsd