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     , renderHash    :: Bool
   48     }
   49    deriving (Show)
   50 
   51 data Preset = Youtube | ExampleGif | Quick | MediumQ | HighQ | LowFPS
   52   deriving (Show)
   53 
   54 readRaster :: String -> Maybe Raster
   55 readRaster raster =
   56   case map toLower raster of
   57     "none"          -> Just RasterNone
   58     "auto"          -> Just RasterAuto
   59     "inkscape"      -> Just RasterInkscape
   60     "rsvg"          -> Just RasterRSvg
   61     "imagemagick"   -> Just RasterMagick
   62     _               -> Nothing
   63 
   64 showRaster :: Raster -> String
   65 showRaster RasterNone     = "none"
   66 showRaster RasterAuto     = "auto"
   67 showRaster RasterInkscape = "inkscape"
   68 showRaster RasterRSvg     = "rsvg"
   69 showRaster RasterMagick   = "imagemagick"
   70 
   71 readFormat :: String -> Maybe Format
   72 readFormat fmt =
   73   case map toLower fmt of
   74     "mp4"  -> Just RenderMp4
   75     "gif"  -> Just RenderGif
   76     "webm" -> Just RenderWebm
   77     _      -> Nothing
   78 
   79 showFormat :: Format -> String
   80 showFormat RenderMp4  = "mp4"
   81 showFormat RenderGif  = "gif"
   82 showFormat RenderWebm = "webm"
   83 
   84 readPreset :: String -> Maybe Preset
   85 readPreset preset =
   86   case map toLower preset of
   87     "youtube" -> Just Youtube
   88     "gif"     -> Just ExampleGif
   89     "quick"   -> Just Quick
   90     "medium"  -> Just MediumQ
   91     "high"    -> Just HighQ
   92     "lowfps"  -> Just LowFPS
   93     _         -> Nothing
   94 
   95 showPreset :: Preset -> String
   96 showPreset Youtube    = "youtube"
   97 showPreset ExampleGif = "gif"
   98 showPreset Quick      = "quick"
   99 showPreset MediumQ    = "medium"
  100 showPreset HighQ      = "high"
  101 showPreset LowFPS     = "lowfps"
  102 
  103 options :: Parser Options
  104 options = Options <$> commandP
  105 
  106 commandP :: Parser Command
  107 commandP = subparser(
  108      command "test" testCommand
  109   <> commandGroup "Internal commands"
  110   <> internal )
  111   <|> hsubparser
  112     ( command "check" checkCommand
  113     <> command "view" viewCommand
  114     <> command "render" renderCommand
  115     <> command "raw" rawCommand
  116     )
  117   <|> infoParser viewCommand
  118 
  119 rawCommand :: ParserInfo Command
  120 rawCommand = info parse
  121     (progDesc "Output raw SVGs for animation at 60 fps. Used internally by viewer.")
  122   where
  123     parse = Raw
  124       <$> strOption
  125         ( long "output" <>
  126           short 'o' <>
  127           metavar "PATH" <>
  128           help "Output folder" <>
  129           value ".")
  130       <*> option auto
  131         ( long "offset" <>
  132           metavar "NUMBER" <>
  133           help "Frame offset" <>
  134           value 0)
  135       <*> switch
  136         ( long "pretty-print" <>
  137           short 'p' <>
  138           help "Pretty print svg")
  139 
  140 testCommand :: ParserInfo Command
  141 testCommand = info (parse <**> helper)
  142     (progDesc "Generate 10 frames spread out evenly across the animation. Used \
  143               \internally by the test-suite.")
  144   where
  145     parse = pure Test
  146 
  147 checkCommand :: ParserInfo Command
  148 checkCommand = info parse
  149     (progDesc "Run a system's diagnostic and report any missing external dependencies.")
  150   where
  151     parse = pure Check
  152 
  153 viewCommand :: ParserInfo Command
  154 viewCommand = info parse
  155     (progDesc "Play animation in browser window.")
  156   where
  157     parse = View
  158       <$> switch
  159         (long "verbose" <> short 'v')
  160       <*> optional (strOption (long "ghc"
  161                     <> metavar "PATH"
  162                     <> help "Path to GHC binary"))
  163       <*> many (strOption (long "ghc-opt"
  164                 <> short 'G'
  165                 <> help "Additional option to pass to ghc"))
  166       <*> optional (strOption (long "self"
  167                     <> metavar "PATH"
  168                     <> help "Source file used for live-reloading"))
  169 
  170 renderCommand :: ParserInfo Command
  171 renderCommand = info parse
  172     (progDesc "Render animation to file.")
  173   where
  174     -- fromPreset :: (Maybe Preset -> (Command -> Command))
  175     -- fromPreset Nothing = id
  176     -- fromPreset (Just ExampleGif) = \cmd -> cmd{renderFPS=24}
  177     -- modParser :: Parser (Command -> Command)
  178     -- modParser = fmap fromPreset $
  179     --   optional (option (maybeReader readPreset)
  180     --       (long "preset" <> showDefaultWith showPreset
  181     --       <> metavar "TYPE"
  182     --       <> help "Parameter presets: youtube, gif, quick"))
  183     parse = Render
  184       <$> optional (strOption (long "target"
  185                     <> short 'o'
  186                     <> metavar "FILE"
  187                     <> help "Write output to FILE"))
  188       <*> optional (option auto
  189           (long "fps" <> metavar "FPS"
  190           <> help "Set frames per second."))
  191       <*> optional (option auto
  192           (long "width" <> short 'w' <> metavar "PIXELS"
  193           <> help "Set video width."))
  194       <*> optional (option auto
  195           (long "height" <> short 'h'
  196           <> metavar "PIXELS" <> help "Set video height."))
  197       <*> switch (long "compile"
  198                   <> help "Compile source code before rendering.")
  199       <*> optional (option (maybeReader readFormat)
  200           (long "format" <> metavar "FMT"
  201           <> help "Video format: mp4, gif, webm"))
  202       <*> optional (option (maybeReader readPreset)
  203           (long "preset" <> showDefaultWith showPreset
  204           <> metavar "TYPE"
  205           <> help "Parameter presets: youtube, gif, quick, medium, high"))
  206       <*> option (maybeReader readRaster)
  207           (long "raster" <> showDefaultWith showRaster
  208           <> metavar "RASTER"
  209           <> value RasterNone
  210           <> help "Raster engine: none, auto, inkscape, rsvg, imagemagick")
  211       <*> switch
  212         (long "partial"
  213         <> help "Produce partial animation even if frame generation was \
  214                 \interrupted by ctrl-c")
  215       <*> flag True False
  216         (long "disable-hashing"
  217         <> help "Disable SVG dedup via hashing. This might improve performance \
  218                 \if all your frames are unique.")
  219 
  220 opts :: ParserInfo Options
  221 opts = info (options <**> helper )
  222   ( fullDesc
  223   <> progDesc "This program contains an animation which can either be viewed \
  224               \in a web-browser or rendered to disk."
  225   )
  226 
  227 getDriverOptions :: IO Options
  228 getDriverOptions = customExecParser (prefs showHelpOnError) opts