{-# LANGUAGE OverloadedStrings, ViewPatterns #-}
import Data.Foldable
import Control.Monad.Writer
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Data.Monoid
data ErrorMsg = WrongFormat
Int
T.Text
deriving Show
type SQL = T.Text
genInsert s1 s2 = "INSERT INTO items VALUES ('" <> s1 <> "','" <> s2 <> "');\n"
processOneLine :: (Int, T.Text) -> Writer [ErrorMsg] SQL
processOneLine (i, T.splitOn ":" -> [s1, s2]) = pure $ genInsert s1 s2
processOneLine (i, s) = writer (T.empty, [WrongFormat i s])
genSQL :: T.Text -> Writer [ErrorMsg] SQL
genSQL t = T.concat <$> traverse processOneLine (zip [1..] $ T.lines t)
testData = "Pen:Bob\nGlass:Mary:10\nPencil:Alice\nBook:Bob\nBottle"
testGenSQL = do
let (sql, errors) = runWriter (genSQL testData)
TIO.putStrLn "SQL:"
TIO.putStr sql
TIO.putStrLn "Errors:"
traverse_ print errors
main = testGenSQL