packages feed

dawdle-0.1.0.1: bin/main.lhs

> {-# LANGUAGE ExplicitForAll,TupleSections,
>              NoMonomorphismRestriction,OverloadedStrings,
>              FlexibleContexts, RankNTypes #-}

> import           Database.Dawdle.Parser
> import           Database.Dawdle.Dawdle
> import           Database.Dawdle.Options
> import           Database.Dawdle.Utils
> import           Database.Dawdle.PrettyPrint

> import qualified Data.Text.Lazy.IO as LT
> import qualified Data.Text.Lazy    as LT
 
> import           Data.Maybe
> import           System.Environment
> import           System.FilePath
> import           System.IO ( hPutStrLn, stdin, stderr )

> main :: IO ()
> main = do
>  a <- getArgs
>  opts <- fst <$> getOpts a
>  let source = fromMaybe "stdin" $ optInput opts
>      sepChar = optSepChar opts
>      inputMode = optInput opts
>      withHeader = optWithHeader opts
>      stopAfter = optStopAfter opts
>  c <- case inputMode of
>         Just f -> LT.readFile f
>         Nothing -> LT.hGetContents stdin
>  c' <- case stopAfter of
>        Nothing ->
>          hPutStrLn stderr "Warning: No limit was set. Entire file will be read" >> 
>          return c
>        Just x -> return $ LT.unlines $ take x $ LT.lines c
>  case parseCsv sepChar source c' of
>    Left e -> do
>      putStrLn "Error parsing input:"
>      print e
>    Right [] -> error "Empty parsing result. Empty CSV?"
>    Right res@(x:xs) ->
>      if withHeader
>      then if null xs
>        then error "No content after header. Empty CSV!"
>        else -- Parse rest with pretty columns
>             let x' = normalizeNames x
>             in putStrLn $ either error (pretty (genTbName source) x') $ analyzeFile opts xs
>      else -- No header, parse entire file
>        let colNms = take (length x) [ "col_"++show i | i <- [1..] :: [Int] ]
>        in putStrLn $ either error (pretty (genTbName source) colNms) $ analyzeFile opts res
 
>  where
>    genTbName = takeBaseName