From a9d77a20008efe82862cc1adbfa7a6d4f09f8ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Menou?= Date: Thu, 8 Dec 2016 10:19:15 +0200 Subject: Release code as open source --- .../src/Text/Edifact/BundleReader/Segments.hs | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 scaffolder/src/Text/Edifact/BundleReader/Segments.hs (limited to 'scaffolder/src/Text/Edifact/BundleReader/Segments.hs') diff --git a/scaffolder/src/Text/Edifact/BundleReader/Segments.hs b/scaffolder/src/Text/Edifact/BundleReader/Segments.hs new file mode 100644 index 0000000..6b71266 --- /dev/null +++ b/scaffolder/src/Text/Edifact/BundleReader/Segments.hs @@ -0,0 +1,55 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Text.Edifact.BundleReader.Segments + ( readSegments + , segmentsDirectory + ) where + +import Text.Edifact.BundleReader.Commons +import Text.Edifact.BundleReader.Configuration (BundleReaderEnv (..)) +import Text.Edifact.Scaffolder.Commons + +import Text.Edifact.Scaffolder.Segments.Specification (listCompositesAndSimples) +import Text.Edifact.Scaffolder.Segments.Types (Element, + getComposite, + getSimple) + +import Control.Monad (when) +import Control.Monad.Reader (asks) +import Data.Bifunctor (bimap) +import Data.ByteString as BS (ByteString, + readFile) +import Data.List as L (partition) +import Data.Maybe (isJust, + mapMaybe) +import Formatting + +segmentsDirectory :: FilePath +segmentsDirectory = "segments" + +readSegments :: [ByteString] -> [SegmentCode] -> BundleReader ([CompositeCode], [SimpleCode]) +readSegments contents segments = do + let parsedFile path = parseFile segments =<< liftIO (BS.readFile path) + parsedString = parseFile segments + files <- asks segmentsFiles + parsedFiles <- traverse parsedFile files + parsedStrings <- traverse parsedString contents + let filtered = concatMap snd $ filter (\s -> fst s `elem` segments) $ concat (parsedFiles <> parsedStrings) + pure $ partitionElements filtered + +parseFile :: [SegmentCode] -> ByteString -> BundleReader [(SegmentCode, [Element])] +parseFile segments content = + let chunks = tail $ splitFileByDash 70 $ decodeContent content + in traverse (parseChunk segments) chunks + +parseChunk :: [SegmentCode] -> Text -> BundleReader (SegmentCode, [Element]) +parseChunk segments chunk = do + parsed <- parseOrFail chunk listCompositesAndSimples + outputFile <- getOutputFile (fSegmentCodeLower % ".txt") segmentsDirectory (fst parsed) + when (fst parsed `elem` segments) $ toFile chunk outputFile + pure parsed + +partitionElements :: [Element] -> ([CompositeCode], [SimpleCode]) +partitionElements = + let isComposite = isJust . getComposite + in bimap (mapMaybe getComposite) (mapMaybe getSimple) . partition isComposite -- cgit v1.2.3