1 module Text.Edifact.Scaffolder.Segments.Specification
4 , listCompositesAndSimples
7 import Text.Edifact.Scaffolder.Commons
8 import Text.Edifact.Scaffolder.Segments.Types
10 import Text.Parsec as P (anyChar, choice,
17 import Text.Parsec.String (Parser)
19 specificationParser :: Parser ((SegmentCode, SegmentName), [Dependency])
20 specificationParser = do
21 segmentInfo <- scanUntil [ segmentParser ]
22 dependencies <- scan [ inLine dependencyParser ] <?> "Segments specification"
23 pure (segmentInfo, dependencies)
25 listCompositesAndSimples :: Parser (SegmentCode, [Element])
26 listCompositesAndSimples = do
27 parsed <- specificationParser
28 pure (fst $ fst parsed, dependencyElement <$> snd parsed)
30 segmentParser :: Parser (SegmentCode, SegmentName)
32 _ <- count 6 (oneOf "+*#|X ")
34 code <- SegmentCode <$> count 3 upper
35 _ <- count 2 (string " ")
37 name <- SegmentName <$> manyTill anyChar (() <$ try endOfLine)
40 dependencyParser :: Parser Dependency
42 Dependency <$> positionParser
43 <* many1 (oneOf "+*#|-X ")
47 inLine :: Parser a -> Parser [a]
48 inLine p = single (many (string " ") *> p)
50 positionParser :: Parser Position
52 fromString <$> count 3 digit
55 elementParser :: Parser Element
57 choice [ compositeParser
62 compositeParser :: Parser Element
63 compositeParser = Composite <$> compositeCodeParser
65 <*> stringToPresenceParser
69 <* many (oneOf " 0123456789")
72 simpleParser :: Parser Element
73 simpleParser = Simple <$> (fromString <$> count 4 digit)
75 <*> stringToPresenceParser
79 <* many (oneOf " 0123456789")
81 <*> simpleLengthParser
84 simpleTypeParser :: Parser SimpleType
85 simpleTypeParser = choice [ Alphanumeric <$ string "an"
86 , Alphabetic <$ string "a"
87 , Numeric <$ string "n"
90 simpleLengthParser :: Parser SimpleLength
91 simpleLengthParser = choice [ UpTo <$> fmap fromString (string ".." >> many1 digit)
92 , Exactly <$> (fromString <$> many1 digit)
95 compositeCodeParser :: Parser CompositeCode
96 compositeCodeParser = do
99 pure (fromString (initial : rest))