{-# LANGUAGE LambdaCase #-} {-# LANGUAGE RecordWildCards #-} import Advent.OCR import Options.Applicative import System.Exit import System.IO import qualified Data.Set as S data Opts = Opts { oChars :: S.Set Char } deriving Show parseOpts :: Parser Opts parseOpts = Opts <$> option (S.fromList <$> str) ( long "chars" <> short 'c' <> help "characters to treat as \"on\"/included" <> value (S.singleton '#') <> showDefaultWith S.toList <> metavar "CHARS" ) main :: IO () main = do Opts{..} <- execParser $ info (parseOpts <**> helper) ( fullDesc <> progDesc "Parse an ASCII image into its letters." <> header "advent-of-code-orc - Advent of Code ASCII parser" ) inp <- getContents case asciiMapToLetters oChars inp of Nothing -> do hPutStrLn stderr "No valid parse" exitFailure Just res -> putStrLn res