module Diagrams.Puzzles.CmdLine
( B
, renderToFile
, RenderOpts(..)
, formats
, checkFormat
, checkType
, exitErr
, readPuzzle
)
where
import Diagrams.Prelude hiding (value, option, (<>), Result)
#ifdef CAIRO
import Diagrams.Backend.Cairo (B, renderCairo)
#else
import Diagrams.Backend.SVG (B, renderSVG)
#endif
import Text.Puzzles.Puzzle
import Data.Puzzles.PuzzleTypes
import System.Exit
import Control.Monad (unless)
import qualified Data.Yaml as Y
data RenderOpts = RenderOpts { _file :: FilePath, _w :: Double }
renderB :: FilePath -> SizeSpec2D -> Diagram B R2 -> IO ()
renderB =
#ifdef CAIRO
renderCairo
#else
renderSVG
#endif
renderToFile :: RenderOpts -> Diagram B R2 -> IO ()
renderToFile ropts = renderB (_file ropts) (Width $ _w ropts)
formats :: [String]
#ifdef CAIRO
formats = ["png", "svg", "ps", "pdf"]
#else
formats = ["svg"]
#endif
checkFormat :: String -> IO ()
checkFormat f = unless (f `elem` formats) $
exitErr $ "unknown format: " ++ f
checkType :: Maybe String -> IO PuzzleType
checkType mt = do
t <- maybe errno return mt
maybe (errunk t) return (lookupType t)
where
errno = exitErr "no puzzle type given"
errunk t = exitErr $ "unknown puzzle type: " ++ t
readPuzzle :: FilePath -> IO (Either Y.ParseException TypedPuzzle)
readPuzzle = Y.decodeFileEither
exitErr :: String -> IO a
exitErr e = putStrLn e >> exitFailure