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