aboutsummaryrefslogtreecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/Scaffolder/Composites
diff options
context:
space:
mode:
Diffstat (limited to 'scaffolder/src/Text/Edifact/Scaffolder/Composites')
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Dependencies.hs20
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Elements.hs20
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Implementation.hs19
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs69
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Types.hs18
5 files changed, 146 insertions, 0 deletions
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Composites/Dependencies.hs b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Dependencies.hs
new file mode 100644
index 0000000..51d45bf
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Dependencies.hs
@@ -0,0 +1,20 @@
1{-# LANGUAGE OverloadedStrings #-}
2
3module Text.Edifact.Scaffolder.Composites.Dependencies
4 ( -- *
5 mkDependenciesHaddock
6 , mkDependenciesImports
7 , mkDependenciesReexports
8 ) where
9
10import Text.Edifact.Scaffolder.Commons
11import Text.Edifact.Scaffolder.Composites.Types
12
13mkDependenciesReexports :: NonEmpty Element -> Scaffolding [Export]
14mkDependenciesReexports = reexportDependencies fElement
15
16mkDependenciesImports :: NonEmpty Element -> Scaffolding [ImportGroup]
17mkDependenciesImports = fmap (pure . singleImport) . importDependencies "Simples" fElement
18
19mkDependenciesHaddock :: NonEmpty Element -> Scaffolding [Text]
20mkDependenciesHaddock = haddockDependencies fElement
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Composites/Elements.hs b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Elements.hs
new file mode 100644
index 0000000..acfcbdb
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Elements.hs
@@ -0,0 +1,20 @@
1module Text.Edifact.Scaffolder.Composites.Elements
2 ( listComposites
3 ) where
4
5import Text.Edifact.Scaffolder.Commons
6
7import Data.Char (toUpper)
8import Text.Parsec (count, digit, eof, oneOf,
9 string)
10import Text.Parsec.String (Parser)
11
12listComposites :: Scaffolding [ElementWithDefinition CompositeCode]
13listComposites = listElements "composites" compositeCodeParser
14
15compositeCodeParser :: Parser CompositeCode
16compositeCodeParser = do
17 initial <- toUpper <$> oneOf "ce"
18 rest <- count 3 digit
19 _ <- string ".txt"
20 CompositeCode (initial : rest) <$ eof
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Composites/Implementation.hs b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Implementation.hs
new file mode 100644
index 0000000..0f3e939
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Implementation.hs
@@ -0,0 +1,19 @@
1{-# LANGUAGE OverloadedStrings #-}
2
3module Text.Edifact.Scaffolder.Composites.Implementation
4 ( -- *
5 toImplementation
6 ) where
7
8import Text.Edifact.Scaffolder.Commons
9import Text.Edifact.Scaffolder.Composites.Types
10
11import Data.List.NonEmpty as NE (toList)
12import Formatting
13
14toImplementation :: NonEmpty Dependency -> [Text]
15toImplementation = haskellList . fmap callDependency . NE.toList
16
17callDependency :: Dependency -> Text
18callDependency (Dependency pos element presence) =
19 sformat (quoted fPosition % " .@ " % fPresence % " " % fElement) pos presence element
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs
new file mode 100644
index 0000000..0bb749d
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs
@@ -0,0 +1,69 @@
1module Text.Edifact.Scaffolder.Composites.Specification
2 ( -- *
3 specificationParser
4 , listSimples
5 ) where
6
7import Text.Edifact.Scaffolder.Commons
8import Text.Edifact.Scaffolder.Composites.Types
9
10import Text.Parsec as P (anyChar, count,
11 digit,
12 endOfLine, many,
13 many1, manyTill,
14 oneOf, skipMany,
15 string, try,
16 (<?>))
17import Text.Parsec.String (Parser)
18
19specificationParser :: Parser ((CompositeCode, CompositeName), [Dependency])
20specificationParser = do
21 compositeInfo <- scanUntil [ compositeParser ]
22 dependencies <- scan [ inLine dependencyParser ] <?> "Composites specification"
23 pure (compositeInfo, dependencies)
24
25listSimples :: Parser (CompositeCode, [SimpleCode])
26listSimples = do
27 parsed <- specificationParser
28 pure (fst $ fst parsed, getElementSimpleCode . dependencyElement <$> snd parsed)
29
30compositeParser :: Parser (CompositeCode, CompositeName)
31compositeParser = do
32 _ <- count 6 (oneOf "+*#|X ")
33 skipMany (string " ")
34 code <- compositeCodeParser
35 _ <- string " "
36 name <- CompositeName <$> manyTill anyChar (() <$ try endOfLine)
37 pure (code, name)
38
39compositeCodeParser :: Parser CompositeCode
40compositeCodeParser = do
41 initial <- oneOf "CE"
42 rest <- count 3 digit
43 pure (fromString (initial : rest))
44
45dependencyParser :: Parser Dependency
46dependencyParser =
47 Dependency <$> positionParser
48 <* many1 (oneOf "+*#|-X ")
49 <*> elementParser
50 <* stringToPresenceParser
51 <* many1 (string " ")
52 <*> presenceParser
53 <?> "Dependency"
54
55inLine :: Parser a -> Parser [a]
56inLine p = single (many (string " ") *> p <* filler)
57
58filler :: Parser ()
59filler = () <$ many (oneOf "an.0123456789 ")
60
61positionParser :: Parser Position
62positionParser =
63 fromString <$> count 3 digit
64 <?> "Position"
65
66elementParser :: Parser Element
67elementParser =
68 fromString <$> count 4 digit
69 <?> "Element"
diff --git a/scaffolder/src/Text/Edifact/Scaffolder/Composites/Types.hs b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Types.hs
new file mode 100644
index 0000000..c7a676f
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/Scaffolder/Composites/Types.hs
@@ -0,0 +1,18 @@
1{-# LANGUAGE DerivingStrategies #-}
2{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3
4module Text.Edifact.Scaffolder.Composites.Types where
5
6import Text.Edifact.Scaffolder.Commons
7
8import Formatting
9
10data Dependency = Dependency { dependencyPosition :: Position
11 , dependencyElement :: Element
12 , dependencyPresence :: Presence
13 } deriving Show
14
15newtype Element = Simple { getElementSimpleCode :: SimpleCode } deriving newtype (Show, Eq, Ord, IsString)
16
17fElement :: Format r (Element -> r)
18fElement = mapf getElementSimpleCode fSimpleParserFunction