module Main (main) where import qualified Data.Text.IO as Text import Text.Megaparsec (errorBundlePretty, runParser) import qualified Data.Text as Text import qualified Sudoku import qualified Sudoku.Solve as Solve import qualified Sudoku.Render as Render import Sudoku.State (State) import Options.Applicative (subparser, command, info, Parser, progDesc, execParser, idm, customExecParser, ParserPrefs, showHelpOnEmpty, prefs) import System.Exit (exitFailure) data Mode = Solve | Hints parseMode :: Parser Mode parseMode = subparser ( command "solve" (info (pure Solve) (progDesc "Solve the supplied sudoku entirely.")) <> command "hints" (info (pure Hints) (progDesc "Show hints for the sudoku.")) ) main :: IO () main = do mode <- customExecParser optparsePreferences (info parseMode idm) input <- Text.getContents sudoku <- case runParser Sudoku.parse "" input of Left errorBundle -> (Text.putStr . Text.pack . errorBundlePretty $ errorBundle) >> exitFailure Right s -> pure s Text.putStr $ case mode of Solve -> Text.pack . show $ Solve.solve State sudoku Hints -> let hints = Solve.hints State sudoku in Render.hints hints optparsePreferences :: ParserPrefs optparsePreferences = prefs showHelpOnEmpty