1 {-# LANGUAGE OverloadedStrings #-}
3 module Text.Edifact.BundleReader.Simples
8 import Text.Edifact.BundleReader.Commons
9 import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..))
10 import Text.Edifact.Scaffolder.Commons
12 import Text.Edifact.Scaffolder.Simples.Specification
14 import Control.Monad (when)
15 import Control.Monad.Reader (asks)
16 import Data.ByteString as BS (ByteString,
20 simplesDirectory :: FilePath
21 simplesDirectory = "simples"
23 readSimples :: [ByteString] -> [SimpleCode] -> BundleReader [SimpleCode]
24 readSimples contents simples = do
25 let parsedFile path = parseFile simples =<< liftIO (BS.readFile path)
26 parsedString = parseFile simples
27 files <- asks simplesFiles
28 parsedFiles <- traverse parsedFile files
29 parsedStrings <- traverse parsedString contents
30 let filtered = filter (`elem` simples) $ concat (parsedFiles <> parsedStrings)
33 parseFile :: [SimpleCode] -> ByteString -> BundleReader [SimpleCode]
34 parseFile simples content =
35 let chunks = tail $ splitFileByDash 70 $ decodeContent content
36 in traverse (parseChunk simples) chunks
38 parseChunk :: [SimpleCode] -> Text -> BundleReader SimpleCode
39 parseChunk simples chunk = do
40 parsed <- parseOrFail chunk specificationParser
41 outputFile <- getOutputFile (fSimpleCodeLower % ".txt") simplesDirectory (fst parsed)
42 when (fst parsed `elem` simples) $ toFile chunk outputFile