]>
Commit | Line | Data |
---|---|---|
a9d77a20 FM |
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 |