]> git.immae.eu Git - github/fretlink/edi-parser.git/blob - scaffolder/src/Text/Edifact/BundleReader/Simples.hs
Release code as open source
[github/fretlink/edi-parser.git] / scaffolder / src / Text / Edifact / BundleReader / Simples.hs
1 {-# LANGUAGE OverloadedStrings #-}
2
3 module Text.Edifact.BundleReader.Simples
4 ( readSimples
5 , simplesDirectory
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.Simples.Specification
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 simplesDirectory :: FilePath
21 simplesDirectory = "simples"
22
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)
31 pure filtered
32
33 parseFile :: [SimpleCode] -> ByteString -> BundleReader [SimpleCode]
34 parseFile simples content =
35 let chunks = tail $ splitFileByDash 70 $ decodeContent content
36 in traverse (parseChunk simples) chunks
37
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
43 pure $ fst parsed