module Turtle.Options.Quality
( optQuality
, defQualityHelp
, quality
) where
import Turtle (ArgName, ShortName, HelpMessage, opt)
import Data.Optional (Optional)
import qualified Turtle
import qualified Data.Text as Text
import Text.Parsec
import Text.ParserCombinators.Parsec.Error (Message(..), newErrorMessage)
import Text.Parsec.Pos (initialPos)
import Turtle.Options.Parsers (Parser, percent, float)
defQualityHelp :: Optional HelpMessage
defQualityHelp = "Quality option. QUALITY can be a percentage (20%) or a keyword: verylow / low / mediumlow / medium / mediumhigh / high / best."
qualitySettings =
[ ("verylow", 0.1)
, ("low", 0.2)
, ("mediumlow", 0.35)
, ("medium", 0.5)
, ("mediumhigh", 0.65)
, ("high", 0.8)
, ("veryhigh", 0.9)
, ("best", 1)
]
keyword :: Parser Float
keyword = do
key <- many1 lower
let q = lookup key qualitySettings
case q of
Nothing -> error ("The keyword '" ++ key ++ "' is not a valid quality setting")
Just v -> return v
quality :: Parser Float
quality = try keyword <|> percent
readQuality :: String -> Maybe Float
readQuality str = case (parse quality "Quality" str) of
Left err -> error $ "Error parsing quality: " ++ (show err)
Right s -> Just s
optQuality :: ArgName -> ShortName -> Optional HelpMessage -> Turtle.Parser Float
optQuality = opt (readQuality . Text.unpack)