{-# LANGUAGE RecordWildCards #-}
module Reanimate.Driver.CLI
( getDriverOptions
, Options(..)
, Command(..)
, Preset(..)
, Format(..)
, showFormat
) where
import Data.Char
import Data.Monoid ((<>))
import Options.Applicative
import Reanimate.Render (Format (..), Width, Height, FPS)
data Options = Options
{ optsCommand :: Command
} deriving (Show)
data Command
= Raw
| Test
| Check
| View
| Render
{ renderTarget :: Maybe String
, renderFPS :: Maybe FPS
, renderWidth :: Maybe Width
, renderHeight :: Maybe Height
, renderCompile :: Bool
, renderFormat :: Maybe Format
, renderPreset :: Maybe Preset
}
deriving (Show)
data Preset = Youtube | ExampleGif | Quick | MediumQ | HighQ
deriving (Show)
readFormat :: String -> Maybe Format
readFormat fmt =
case map toLower fmt of
"mp4" -> Just RenderMp4
"gif" -> Just RenderGif
"webm" -> Just RenderWebm
_ -> Nothing
showFormat :: Format -> String
showFormat RenderMp4 = "mp4"
showFormat RenderGif = "gif"
showFormat RenderWebm = "webm"
readPreset :: String -> Maybe Preset
readPreset preset =
case map toLower preset of
"youtube" -> Just Youtube
"gif" -> Just ExampleGif
"quick" -> Just Quick
"medium" -> Just MediumQ
"high" -> Just HighQ
_ -> Nothing
showPreset :: Preset -> String
showPreset Youtube = "youtube"
showPreset ExampleGif = "gif"
showPreset Quick = "quick"
showPreset MediumQ = "medium"
showPreset HighQ = "high"
options :: Parser Options
options = Options <$> commandP
commandP :: Parser Command
commandP = subparser(command "raw" rawCommand
<> command "test" testCommand
<> commandGroup "Internal commands"
<> internal )
<|> hsubparser
( command "check" checkCommand
<> command "view" viewCommand
<> command "render" renderCommand
)
<|> infoParser viewCommand
rawCommand :: ParserInfo Command
rawCommand = info (parse)
(progDesc "Output raw SVGs for animation at 60 fps. Used internally by viewer.")
where
parse = pure Raw
testCommand :: ParserInfo Command
testCommand = info (parse <**> helper)
(progDesc "Generate 50 frames spread out evenly across the animation. Used \
\internally by the test-suite.")
where
parse = pure Test
checkCommand :: ParserInfo Command
checkCommand = info parse
(progDesc "Run a system's diagnostic and report any missing external dependencies.")
where
parse = pure Check
viewCommand :: ParserInfo Command
viewCommand = info parse
(progDesc "Play animation in browser window.")
where
parse = pure View
renderCommand :: ParserInfo Command
renderCommand = info parse
(progDesc "Render animation to file.")
where
parse = Render
<$> optional (strOption (long "target"
<> short 'o'
<> metavar "FILE"
<> help "Write output to FILE"))
<*> optional (option auto
(long "fps" <> metavar "FPS"
<> help "Set frames per second."))
<*> optional (option auto
(long "width" <> short 'w' <> metavar "PIXELS"
<> help "Set video width."))
<*> optional (option auto
(long "height" <> short 'h'
<> metavar "PIXELS" <> help "Set video height."))
<*> switch (long "compile"
<> help "Compile source code before rendering.")
<*> optional (option (maybeReader readFormat)
(long "format" <> metavar "FMT"
<> help "Video format: mp4, gif, webm"))
<*> optional (option (maybeReader readPreset)
(long "preset" <> showDefaultWith showPreset
<> metavar "TYPE"
<> help "Parameter presets: youtube, gif, quick, medium, high"))
opts :: ParserInfo Options
opts = info (options <**> helper )
( fullDesc
<> progDesc "This program contains an animation which can either be viewed \
\in a web-browser or rendered to disk."
)
getDriverOptions :: IO Options
getDriverOptions = customExecParser (prefs showHelpOnError) opts