diff options
author | Frédéric Menou <frederic.menou@fretlink.com> | 2016-12-08 10:19:15 +0200 |
---|---|---|
committer | Ismaël Bouya <ismael.bouya@fretlink.com> | 2022-05-17 18:01:51 +0200 |
commit | a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7 (patch) | |
tree | adf3186fdccaeef19151026cdfbd38a530cf9ecb /scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs | |
download | edi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.tar.gz edi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.tar.zst edi-parser-a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7.zip |
Diffstat (limited to 'scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs')
-rw-r--r-- | scaffolder/src/Text/Edifact/Scaffolder/Composites/Specification.hs | 69 |
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 @@ | |||
1 | module Text.Edifact.Scaffolder.Composites.Specification | ||
2 | ( -- * | ||
3 | specificationParser | ||
4 | , listSimples | ||
5 | ) where | ||
6 | |||
7 | import Text.Edifact.Scaffolder.Commons | ||
8 | import Text.Edifact.Scaffolder.Composites.Types | ||
9 | |||
10 | import Text.Parsec as P (anyChar, count, | ||
11 | digit, | ||
12 | endOfLine, many, | ||
13 | many1, manyTill, | ||
14 | oneOf, skipMany, | ||
15 | string, try, | ||
16 | (<?>)) | ||
17 | import Text.Parsec.String (Parser) | ||
18 | |||
19 | specificationParser :: Parser ((CompositeCode, CompositeName), [Dependency]) | ||
20 | specificationParser = do | ||
21 | compositeInfo <- scanUntil [ compositeParser ] | ||
22 | dependencies <- scan [ inLine dependencyParser ] <?> "Composites specification" | ||
23 | pure (compositeInfo, dependencies) | ||
24 | |||
25 | listSimples :: Parser (CompositeCode, [SimpleCode]) | ||
26 | listSimples = do | ||
27 | parsed <- specificationParser | ||
28 | pure (fst $ fst parsed, getElementSimpleCode . dependencyElement <$> snd parsed) | ||
29 | |||
30 | compositeParser :: Parser (CompositeCode, CompositeName) | ||
31 | compositeParser = 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 | |||
39 | compositeCodeParser :: Parser CompositeCode | ||
40 | compositeCodeParser = do | ||
41 | initial <- oneOf "CE" | ||
42 | rest <- count 3 digit | ||
43 | pure (fromString (initial : rest)) | ||
44 | |||
45 | dependencyParser :: Parser Dependency | ||
46 | dependencyParser = | ||
47 | Dependency <$> positionParser | ||
48 | <* many1 (oneOf "+*#|-X ") | ||
49 | <*> elementParser | ||
50 | <* stringToPresenceParser | ||
51 | <* many1 (string " ") | ||
52 | <*> presenceParser | ||
53 | <?> "Dependency" | ||
54 | |||
55 | inLine :: Parser a -> Parser [a] | ||
56 | inLine p = single (many (string " ") *> p <* filler) | ||
57 | |||
58 | filler :: Parser () | ||
59 | filler = () <$ many (oneOf "an.0123456789 ") | ||
60 | |||
61 | positionParser :: Parser Position | ||
62 | positionParser = | ||
63 | fromString <$> count 3 digit | ||
64 | <?> "Position" | ||
65 | |||
66 | elementParser :: Parser Element | ||
67 | elementParser = | ||
68 | fromString <$> count 4 digit | ||
69 | <?> "Element" | ||