hw-dsv-0.3.0: app/App/Commands/Generate.hs
module App.Commands.Generate
( cmdGenerate
) where
import App.Commands.Options.Type
import Control.Lens
import Data.List
import Data.Semigroup ((<>))
import Options.Applicative hiding (columns)
import qualified App.Gen as G
import qualified App.Lens as L
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
printField :: String -> String
printField cs = if any invalid cs
then escape cs
else cs
where invalid c = c == ',' || c == '\r' || c == '\n' || c == '"'
escape = ("\"" <>) . (<> "\"") . concatMap (\c -> if c == '"' then "\"\"" else [c])
runGenerate :: GenerateOptions -> IO ()
runGenerate opts = do
let fields = opts ^. L.fields
let rows = opts ^. L.rows
csv <- G.sample (G.list (R.singleton rows) (G.list (R.singleton fields) (G.field))) :: IO [[String]]
putStr $ unlines $ map (intercalate "," . map printField) csv
return ()
optsGenerate :: Parser GenerateOptions
optsGenerate = GenerateOptions
<$> option auto
( long "fields"
<> help "Number of fields"
<> metavar "INT"
)
<*> option auto
( long "rows"
<> help "Number of rows"
<> metavar "INT"
)
cmdGenerate :: Mod CommandFields (IO ())
cmdGenerate = command "generate" $ flip info idm $ runGenerate <$> optsGenerate