never executed always true always false
    1 module Reanimate.Driver.CLI
    2   ( getDriverOptions
    3   , Options(..)
    4   , Command(..)
    5   , Preset(..)
    6   , Format(..)
    7   , Raster(..)
    8   , showFormat
    9   , showRaster
   10   ) where
   11 
   12 import           Data.Char
   13 import           Data.Monoid
   14 import           Options.Applicative
   15 import           Prelude
   16 import           Reanimate.Render    (FPS, Format (..), Height, Raster (..),
   17                                       Width)
   18 
   19 newtype Options = Options
   20   { optsCommand :: Command
   21   } deriving (Show)
   22 
   23 data Command
   24   = Raw
   25     { rawOutputFolder :: FilePath
   26     , rawFrameOffset  :: Int
   27     , rawPrettyPrint  :: Bool
   28     }
   29   | Test
   30   | Check
   31   | View
   32     { viewVerbose   :: Bool
   33     , viewGHCPath   :: Maybe FilePath
   34     , viewGHCOpts   :: [String]
   35     , viewOrigin    :: Maybe FilePath
   36     }
   37   | Render
   38     { renderTarget  :: Maybe String
   39     , renderFPS     :: Maybe FPS
   40     , renderWidth   :: Maybe Width
   41     , renderHeight  :: Maybe Height
   42     , renderCompile :: Bool
   43     , renderFormat  :: Maybe Format
   44     , renderPreset  :: Maybe Preset
   45     , renderRaster  :: Raster
   46     , renderPartial :: Bool
   47     }
   48    deriving (Show)
   49 
   50 data Preset = Youtube | ExampleGif | Quick | MediumQ | HighQ | LowFPS
   51   deriving (Show)
   52 
   53 readRaster :: String -> Maybe Raster
   54 readRaster raster =
   55   case map toLower raster of
   56     "none"          -> Just RasterNone
   57     "auto"          -> Just RasterAuto
   58     "inkscape"      -> Just RasterInkscape
   59     "rsvg"          -> Just RasterRSvg
   60     "imagemagick"   -> Just RasterMagick
   61     _               -> Nothing
   62 
   63 showRaster :: Raster -> String
   64 showRaster RasterNone     = "none"
   65 showRaster RasterAuto     = "auto"
   66 showRaster RasterInkscape = "inkscape"
   67 showRaster RasterRSvg     = "rsvg"
   68 showRaster RasterMagick   = "imagemagick"
   69 
   70 readFormat :: String -> Maybe Format
   71 readFormat fmt =
   72   case map toLower fmt of
   73     "mp4"  -> Just RenderMp4
   74     "gif"  -> Just RenderGif
   75     "webm" -> Just RenderWebm
   76     _      -> Nothing
   77 
   78 showFormat :: Format -> String
   79 showFormat RenderMp4  = "mp4"
   80 showFormat RenderGif  = "gif"
   81 showFormat RenderWebm = "webm"
   82 
   83 readPreset :: String -> Maybe Preset
   84 readPreset preset =
   85   case map toLower preset of
   86     "youtube" -> Just Youtube
   87     "gif"     -> Just ExampleGif
   88     "quick"   -> Just Quick
   89     "medium"  -> Just MediumQ
   90     "high"    -> Just HighQ
   91     "lowfps"  -> Just LowFPS
   92     _         -> Nothing
   93 
   94 showPreset :: Preset -> String
   95 showPreset Youtube    = "youtube"
   96 showPreset ExampleGif = "gif"
   97 showPreset Quick      = "quick"
   98 showPreset MediumQ    = "medium"
   99 showPreset HighQ      = "high"
  100 showPreset LowFPS     = "lowfps"
  101 
  102 options :: Parser Options
  103 options = Options <$> commandP
  104 
  105 commandP :: Parser Command
  106 commandP = subparser(
  107      command "test" testCommand
  108   <> commandGroup "Internal commands"
  109   <> internal )
  110   <|> hsubparser
  111     ( command "check" checkCommand
  112     <> command "view" viewCommand
  113     <> command "render" renderCommand
  114     <> command "raw" rawCommand
  115     )
  116   <|> infoParser viewCommand
  117 
  118 rawCommand :: ParserInfo Command
  119 rawCommand = info parse
  120     (progDesc "Output raw SVGs for animation at 60 fps. Used internally by viewer.")
  121   where
  122     parse = Raw
  123       <$> strOption
  124         ( long "output" <>
  125           short 'o' <>
  126           metavar "PATH" <>
  127           help "Output folder" <>
  128           value ".")
  129       <*> option auto
  130         ( long "offset" <>
  131           metavar "NUMBER" <>
  132           help "Frame offset" <>
  133           value 0)
  134       <*> switch
  135         ( long "pretty-print" <>
  136           short 'p' <>
  137           help "Pretty print svg")
  138 
  139 testCommand :: ParserInfo Command
  140 testCommand = info (parse <**> helper)
  141     (progDesc "Generate 10 frames spread out evenly across the animation. Used \
  142               \internally by the test-suite.")
  143   where
  144     parse = pure Test
  145 
  146 checkCommand :: ParserInfo Command
  147 checkCommand = info parse
  148     (progDesc "Run a system's diagnostic and report any missing external dependencies.")
  149   where
  150     parse = pure Check
  151 
  152 viewCommand :: ParserInfo Command
  153 viewCommand = info parse
  154     (progDesc "Play animation in browser window.")
  155   where
  156     parse = View
  157       <$> switch
  158         (long "verbose" <> short 'v')
  159       <*> optional (strOption (long "ghc"
  160                     <> metavar "PATH"
  161                     <> help "Path to GHC binary"))
  162       <*> many (strOption (long "ghc-opt"
  163                 <> short 'G'
  164                 <> help "Additional option to pass to ghc"))
  165       <*> optional (strOption (long "self"
  166                     <> metavar "PATH"
  167                     <> help "Source file used for live-reloading"))
  168 
  169 renderCommand :: ParserInfo Command
  170 renderCommand = info parse
  171     (progDesc "Render animation to file.")
  172   where
  173     -- fromPreset :: (Maybe Preset -> (Command -> Command))
  174     -- fromPreset Nothing = id
  175     -- fromPreset (Just ExampleGif) = \cmd -> cmd{renderFPS=24}
  176     -- modParser :: Parser (Command -> Command)
  177     -- modParser = fmap fromPreset $
  178     --   optional (option (maybeReader readPreset)
  179     --       (long "preset" <> showDefaultWith showPreset
  180     --       <> metavar "TYPE"
  181     --       <> help "Parameter presets: youtube, gif, quick"))
  182     parse = Render
  183       <$> optional (strOption (long "target"
  184                     <> short 'o'
  185                     <> metavar "FILE"
  186                     <> help "Write output to FILE"))
  187       <*> optional (option auto
  188           (long "fps" <> metavar "FPS"
  189           <> help "Set frames per second."))
  190       <*> optional (option auto
  191           (long "width" <> short 'w' <> metavar "PIXELS"
  192           <> help "Set video width."))
  193       <*> optional (option auto
  194           (long "height" <> short 'h'
  195           <> metavar "PIXELS" <> help "Set video height."))
  196       <*> switch (long "compile"
  197                   <> help "Compile source code before rendering.")
  198       <*> optional (option (maybeReader readFormat)
  199           (long "format" <> metavar "FMT"
  200           <> help "Video format: mp4, gif, webm"))
  201       <*> optional (option (maybeReader readPreset)
  202           (long "preset" <> showDefaultWith showPreset
  203           <> metavar "TYPE"
  204           <> help "Parameter presets: youtube, gif, quick, medium, high"))
  205       <*> option (maybeReader readRaster)
  206           (long "raster" <> showDefaultWith showRaster
  207           <> metavar "RASTER"
  208           <> value RasterNone
  209           <> help "Raster engine: none, auto, inkscape, rsvg, imagemagick")
  210       <*> switch
  211         (long "partial"
  212         <> help "Produce partial animation even if frame generation was \
  213                 \interrupted by ctrl-c")
  214 
  215 opts :: ParserInfo Options
  216 opts = info (options <**> helper )
  217   ( fullDesc
  218   <> progDesc "This program contains an animation which can either be viewed \
  219               \in a web-browser or rendered to disk."
  220   )
  221 
  222 getDriverOptions :: IO Options
  223 getDriverOptions = customExecParser (prefs showHelpOnError) opts