]> git.immae.eu Git - github/fretlink/edi-parser.git/blob - scaffolder/src/Text/Edifact/BundleReader/Composites.hs
Release code as open source
[github/fretlink/edi-parser.git] / scaffolder / src / Text / Edifact / BundleReader / Composites.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 module Text.Edifact.BundleReader.Composites
4 ( readComposites
5 , compositesDirectory
6 ) where
7
8 import Text.Edifact.BundleReader.Commons
9 import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..))
10 import Text.Edifact.Scaffolder.Commons
11
12 import Text.Edifact.Scaffolder.Composites.Specification (listSimples)
13
14 import Control.Monad (when)
15 import Control.Monad.Reader (asks)
16 import Data.ByteString as BS (ByteString,
17 readFile)
18 import Formatting
19
20 compositesDirectory :: FilePath
21 compositesDirectory = "composites"
22
23 readComposites :: [ByteString] -> ([CompositeCode], [SimpleCode]) -> BundleReader [SimpleCode]
24 readComposites contents (composites, simples) = do
25 let parsedFile path = parseFile composites =<< liftIO (BS.readFile path)
26 parsedString = parseFile composites
27 files <- asks compositesFiles
28 parsedFiles <- traverse parsedFile files
29 parsedStrings <- traverse parsedString contents
30 let filtered = mappend simples $ concatMap snd $ filter (\s -> fst s `elem` composites) $ concat (parsedFiles <> parsedStrings)
31 pure filtered
32
33 parseFile :: [CompositeCode] -> ByteString -> BundleReader [(CompositeCode, [SimpleCode])]
34 parseFile composites content =
35 let chunks = tail $ splitFileByDash 70 $ decodeContent content
36 in traverse (parseChunk composites) chunks
37
38 parseChunk :: [CompositeCode] -> Text -> BundleReader (CompositeCode, [SimpleCode])
39 parseChunk composites chunk = do
40 parsed <- parseOrFail chunk listSimples
41 outputFile <- getOutputFile (fCompositeCodeLower % ".txt") compositesDirectory (fst parsed)
42 when (fst parsed `elem` composites) $ toFile chunk outputFile
43 pure parsed