]> git.immae.eu Git - github/fretlink/edi-parser.git/blame - scaffolder/src/Text/Edifact/BundleReader/Composites.hs
Release code as open source
[github/fretlink/edi-parser.git] / scaffolder / src / Text / Edifact / BundleReader / Composites.hs
CommitLineData
a9d77a20
FM
1{-# LANGUAGE OverloadedStrings #-}
2
3module Text.Edifact.BundleReader.Composites
4 ( readComposites
5 , compositesDirectory
6 ) where
7
8import Text.Edifact.BundleReader.Commons
9import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..))
10import Text.Edifact.Scaffolder.Commons
11
12import Text.Edifact.Scaffolder.Composites.Specification (listSimples)
13
14import Control.Monad (when)
15import Control.Monad.Reader (asks)
16import Data.ByteString as BS (ByteString,
17 readFile)
18import Formatting
19
20compositesDirectory :: FilePath
21compositesDirectory = "composites"
22
23readComposites :: [ByteString] -> ([CompositeCode], [SimpleCode]) -> BundleReader [SimpleCode]
24readComposites 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
33parseFile :: [CompositeCode] -> ByteString -> BundleReader [(CompositeCode, [SimpleCode])]
34parseFile composites content =
35 let chunks = tail $ splitFileByDash 70 $ decodeContent content
36 in traverse (parseChunk composites) chunks
37
38parseChunk :: [CompositeCode] -> Text -> BundleReader (CompositeCode, [SimpleCode])
39parseChunk 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