packages feed

spreadsheet-0.1.3.9: example/CSVReplace.hs

module Main where

import qualified CSVReplace.Option as Option
import qualified Options.Applicative as OP
import Shell.Utility.Exit (exitFailureMsg)

import qualified Data.Spreadsheet as Sheet
import qualified Data.List.HT as ListHT

import qualified Control.Monad.Exception.Asynchronous as AExc
import Control.Applicative ((<$>), )

import qualified Data.Foldable as Fold
import Data.Foldable (forM_, )



replaceRow :: String -> [String] -> [String] -> String
replaceRow template names row =
   ListHT.multiReplace (filter (not . null . fst) $ zip names row) template

replace :: String -> [String] -> Sheet.T -> String
replace template names = concatMap (replaceRow template names)


main :: IO ()
main = do
   opt <- OP.execParser $ Option.info Option.parser
   template <- Option.readTemplate opt
   sheet <-
      Sheet.fromString (Option.quotation opt) (Option.delimiter opt) <$>
      getContents
   case AExc.result sheet of
      [] -> exitFailureMsg "empty CSV input"
      names:rows ->
         case Option.multiFile opt of
            Nothing -> putStr $ replace template names rows
            Just filePattern ->
               forM_ rows $ \row ->
                  writeFile (replaceRow filePattern names row) $
                     replaceRow template names row
   Fold.mapM_ exitFailureMsg $ AExc.exception sheet