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