aboutsummaryrefslogtreecommitdiffhomepage
path: root/scaffolder/src/Text/Edifact/BundleReader/Segments.hs
diff options
context:
space:
mode:
Diffstat (limited to 'scaffolder/src/Text/Edifact/BundleReader/Segments.hs')
-rw-r--r--scaffolder/src/Text/Edifact/BundleReader/Segments.hs55
1 files changed, 55 insertions, 0 deletions
diff --git a/scaffolder/src/Text/Edifact/BundleReader/Segments.hs b/scaffolder/src/Text/Edifact/BundleReader/Segments.hs
new file mode 100644
index 0000000..6b71266
--- /dev/null
+++ b/scaffolder/src/Text/Edifact/BundleReader/Segments.hs
@@ -0,0 +1,55 @@
1{-# LANGUAGE OverloadedStrings #-}
2
3module Text.Edifact.BundleReader.Segments
4 ( readSegments
5 , segmentsDirectory
6 ) where
7
8import Text.Edifact.BundleReader.Commons
9import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..))
10import Text.Edifact.Scaffolder.Commons
11
12import Text.Edifact.Scaffolder.Segments.Specification (listCompositesAndSimples)
13import Text.Edifact.Scaffolder.Segments.Types (Element,
14 getComposite,
15 getSimple)
16
17import Control.Monad (when)
18import Control.Monad.Reader (asks)
19import Data.Bifunctor (bimap)
20import Data.ByteString as BS (ByteString,
21 readFile)
22import Data.List as L (partition)
23import Data.Maybe (isJust,
24 mapMaybe)
25import Formatting
26
27segmentsDirectory :: FilePath
28segmentsDirectory = "segments"
29
30readSegments :: [ByteString] -> [SegmentCode] -> BundleReader ([CompositeCode], [SimpleCode])
31readSegments contents segments = do
32 let parsedFile path = parseFile segments =<< liftIO (BS.readFile path)
33 parsedString = parseFile segments
34 files <- asks segmentsFiles
35 parsedFiles <- traverse parsedFile files
36 parsedStrings <- traverse parsedString contents
37 let filtered = concatMap snd $ filter (\s -> fst s `elem` segments) $ concat (parsedFiles <> parsedStrings)
38 pure $ partitionElements filtered
39
40parseFile :: [SegmentCode] -> ByteString -> BundleReader [(SegmentCode, [Element])]
41parseFile segments content =
42 let chunks = tail $ splitFileByDash 70 $ decodeContent content
43 in traverse (parseChunk segments) chunks
44
45parseChunk :: [SegmentCode] -> Text -> BundleReader (SegmentCode, [Element])
46parseChunk segments chunk = do
47 parsed <- parseOrFail chunk listCompositesAndSimples
48 outputFile <- getOutputFile (fSegmentCodeLower % ".txt") segmentsDirectory (fst parsed)
49 when (fst parsed `elem` segments) $ toFile chunk outputFile
50 pure parsed
51
52partitionElements :: [Element] -> ([CompositeCode], [SimpleCode])
53partitionElements =
54 let isComposite = isJust . getComposite
55 in bimap (mapMaybe getComposite) (mapMaybe getSimple) . partition isComposite