packages feed

swarm-0.7.0.0: app/scene/Main.hs

{-# LANGUAGE OverloadedStrings #-}

-- |
-- SPDX-License-Identifier: BSD-3-Clause
module Main where

import Options.Applicative
import Swarm.Game.Scenario.Topography.Area (AreaDimensions (..))
import Swarm.Game.World.Render (FailureMode (..), OuputFormat (..), RenderComputationContext (..), RenderOpts (..), doRenderCmd)

data CLI
  = RenderMap FilePath RenderOpts

cliParser :: Parser CLI
cliParser =
  RenderMap <$> strArgument (metavar "SCENARIO") <*> subOpts
 where
  sizeOpts =
    AreaDimensions
      <$> option auto (metavar "WIDTH" <> short 'w' <> long "width" <> help "width of source grid")
      <*> option auto (metavar "HEIGHT" <> short 'h' <> long "height" <> help "height of source grid")

  renderComputationOpts =
    RenderComputationContext
      <$> seed
      <*> optional sizeOpts

  subOpts =
    RenderOpts
      <$> renderComputationOpts
      <*> flag ConsoleText PngImage (long "png" <> help "Render to PNG")
      <*> option str (long "dest" <> short 'd' <> value "output.png" <> help "Output filepath")
      <*> flag Terminate RenderBlankImage (long "fail-blank" <> short 'b' <> help "Render blank image upon failure")

  seed :: Parser (Maybe Int)
  seed = optional $ option auto (long "seed" <> short 's' <> metavar "INT" <> help "Seed to use for world generation")

cliInfo :: ParserInfo CLI
cliInfo =
  info
    (cliParser <**> helper)
    ( header "Swarm scene"
        <> progDesc "Render a scenario world map."
        <> fullDesc
    )

main :: IO ()
main = do
  cli <- execParser cliInfo
  case cli of
    RenderMap mapPath opts -> doRenderCmd opts mapPath