1 {-# LANGUAGE OverloadedStrings #-}
3 module Text.Edifact.BundleReader.Composites
8 import Text.Edifact.BundleReader.Commons
9 import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..))
10 import Text.Edifact.Scaffolder.Commons
12 import Text.Edifact.Scaffolder.Composites.Specification (listSimples)
14 import Control.Monad (when)
15 import Control.Monad.Reader (asks)
16 import Data.ByteString as BS (ByteString,
20 compositesDirectory :: FilePath
21 compositesDirectory = "composites"
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)
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
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