aboutsummaryrefslogtreecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs
diff options
context:
space:
mode:
authorFrédéric Menou <frederic.menou@fretlink.com>2016-12-08 10:19:15 +0200
committerIsmaël Bouya <ismael.bouya@fretlink.com>2022-05-17 18:01:51 +0200
commita9d77a20008efe82862cc1adbfa7a6d4f09f8ff7 (patch)
treeadf3186fdccaeef19151026cdfbd38a530cf9ecb /scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs
downloadedi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.tar.gz
edi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.tar.zst
edi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.zip
Release code as open sourceHEADmaster
Diffstat (limited to 'scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs')
-rw-r--r--scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs69
1 files changed, 69 insertions, 0 deletions
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"