{-# LANGUAGE DeriveDataTypeable #-}
module Main where
import Diagrams.Prelude
import Diagrams.Backend.SVG.CmdLine
import Diagrams.TwoD.Path.Turtle
import Logo.Types
import Logo.TokenParser
import Logo.Builtins
import Logo.Evaluator
import System.Environment (getProgName, withArgs)
import System.Console.CmdArgs.Implicit
import qualified Data.Map as M
data LogoOpts = LogoOpts
{ output :: String -- output file to write to
, src :: Maybe String -- source file to read from
} deriving (Show, Data, Typeable)
logoOpts :: String -> LogoOpts
logoOpts prog = LogoOpts
{ output = "logo.svg"
&= typFile
&= help "Output image file (default=logo.svg)"
, src = def
&= typFile
&= args
}
&= summary "hs-logo Logo Interpreter v0.1"
&= program prog
main :: IO ()
main = do
prog <- getProgName
opts <- cmdArgs (logoOpts prog)
case src opts of
Nothing -> error "Source file not specified"
Just s -> renderLogo s (output opts)
renderLogo :: String -> String -> IO ()
renderLogo s o = do
tokens <- readSource s
diag <- stroke <$> runTurtleT (evaluateSourceTokens tokens)
withArgs ["-o", o, "-w", "400", "-h", "400"] $ defaultMain (diag # lw (0.005 * width diag) # centerXY # pad 1.1)
readSource :: FilePath -> IO [LogoToken]
readSource f = do
tokens <- tokenize f <$> readFile f
case tokens of
Left x -> error $ show x
Right t -> return t
evaluateSourceTokens :: [LogoToken] -> TurtleIO ()
evaluateSourceTokens tokens = do
let initialContext = LogoContext builtins M.empty M.empty
res <- evaluateWithContext tokens initialContext
case res of
Left err -> error $ show err
Right _ -> return ()