aboutsummaryrefslogtreecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/Scaffolder/Segments.hs
diff options
context:
space:
mode:
Diffstat (limited to 'scaffolder/src/Text/Edifact/Scaffolder/Segments.hs')
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Segments.hs54
1 files changed, 54 insertions, 0 deletions
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Segments.hs b/scaffolder/src/Text/Edifact/Scaffolder/Segments.hs
new file mode 100644
index 0000000..a0b6c3d
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Segments.hs
@@ -0,0 +1,54 @@
1{-# LANGUAGE OverloadedStrings #-}
2
3module Text.Edifact.Scaffolder.Segments
4 ( segments
5 ) where
6
7import Text.Edifact.Scaffolder.Commons
8
9import Text.Edifact.Scaffolder.Segments.Dependencies
10import Text.Edifact.Scaffolder.Segments.Elements
11import Text.Edifact.Scaffolder.Segments.Implementation
12import Text.Edifact.Scaffolder.Segments.Specification
13import Text.Edifact.Scaffolder.Segments.Types
14
15import Data.List.NonEmpty (nubBy)
16import Formatting
17
18segments :: Scaffolding ()
19segments = listSegments >>= scaffoldElements parentSegmentModule segmentModule
20
21parentSegmentModule :: NonEmpty (ElementWithDefinition SegmentCode) -> Scaffolding ()
22parentSegmentModule = parentModule "Segments" "S" segmentModuleName
23
24segmentModuleName :: ModuleName -> SegmentCode -> ModuleName
25segmentModuleName mn code = mn <.> fromString (getSegmentCode code)
26
27segmentModule :: ElementWithDefinition SegmentCode -> Scaffolding ()
28segmentModule (inputFile, code) = do
29 moduleName <- getRootModuleNameFor (segmentModuleName "Segments" code)
30 dependencies <- scanDependencies inputFile (snd <$> specificationParser)
31 specification <- includeSpecification inputFile
32 let parserFunction = fSegmentParserFunction
33 fDescription = "Segment " % fSegmentCode
34 parserNotYetImplemented = sformat (notYetImplemented fDescription) code
35 defaultImplementation = haskellList [ parserNotYetImplemented ]
36 elements = sort . nubBy (\a b -> getCode a == getCode b) . fmap dependencyElement <$> dependencies
37 implementation = maybe defaultImplementation toImplementation dependencies
38 buildDependencies b = fromMaybe [] <$> traverse b elements
39 dependenciesReexports <- buildDependencies mkDependenciesReexports
40 dependenciesImports <- buildDependencies mkDependenciesImports
41 dependenciesHaddock <- buildDependencies mkDependenciesHaddock
42 let exports = Comment "* Definition"
43 : Name (sformat parserFunction code)
44 : dependenciesReexports
45 imports = dependenciesImports
46 <> [ importCombinators ]
47 <> maybe [ importNotYetImplementedHelper ] (const []) dependencies
48 documentation = specification <> dependenciesHaddock
49 signature = sformat (fParserSignature parserFunction) code
50 definition = [ sformat (fParserDeclaration parserFunction) code
51 , indent (sformat ("segment " % quoted fSegmentCode) code)
52 ] <> (indent . indent <$> implementation)
53 parser = signature : definition
54 scaffoldModule moduleName ["OverloadedStrings"] exports imports (documentation <> parser)