-- |
-- SPDX-License-Identifier: BSD-3-Clause
--
-- Sum type representing the Swarm debug options.
module Swarm.TUI.Model.DebugOption (
  DebugOption (..),
  debugOptionName,
  debugOptionDescription,
  readDebugOption,
  readDebugOptionList,
) where

import Data.Foldable (find, foldl')
import Data.List.Extra (enumerate, splitOn, trim)
import Prelude hiding (Foldable (..))

data DebugOption
  = ToggleCreative
  | ToggleWorldEditor
  | DebugCESK
  | ListAllRobots
  | ListRobotIDs
  | ShowHiddenGoals
  | LoadTestingScenarios
  deriving (DebugOption -> DebugOption -> Bool
(DebugOption -> DebugOption -> Bool)
-> (DebugOption -> DebugOption -> Bool) -> Eq DebugOption
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DebugOption -> DebugOption -> Bool
== :: DebugOption -> DebugOption -> Bool
$c/= :: DebugOption -> DebugOption -> Bool
/= :: DebugOption -> DebugOption -> Bool
Eq, Eq DebugOption
Eq DebugOption =>
(DebugOption -> DebugOption -> Ordering)
-> (DebugOption -> DebugOption -> Bool)
-> (DebugOption -> DebugOption -> Bool)
-> (DebugOption -> DebugOption -> Bool)
-> (DebugOption -> DebugOption -> Bool)
-> (DebugOption -> DebugOption -> DebugOption)
-> (DebugOption -> DebugOption -> DebugOption)
-> Ord DebugOption
DebugOption -> DebugOption -> Bool
DebugOption -> DebugOption -> Ordering
DebugOption -> DebugOption -> DebugOption
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DebugOption -> DebugOption -> Ordering
compare :: DebugOption -> DebugOption -> Ordering
$c< :: DebugOption -> DebugOption -> Bool
< :: DebugOption -> DebugOption -> Bool
$c<= :: DebugOption -> DebugOption -> Bool
<= :: DebugOption -> DebugOption -> Bool
$c> :: DebugOption -> DebugOption -> Bool
> :: DebugOption -> DebugOption -> Bool
$c>= :: DebugOption -> DebugOption -> Bool
>= :: DebugOption -> DebugOption -> Bool
$cmax :: DebugOption -> DebugOption -> DebugOption
max :: DebugOption -> DebugOption -> DebugOption
$cmin :: DebugOption -> DebugOption -> DebugOption
min :: DebugOption -> DebugOption -> DebugOption
Ord, Int -> DebugOption -> ShowS
[DebugOption] -> ShowS
DebugOption -> String
(Int -> DebugOption -> ShowS)
-> (DebugOption -> String)
-> ([DebugOption] -> ShowS)
-> Show DebugOption
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DebugOption -> ShowS
showsPrec :: Int -> DebugOption -> ShowS
$cshow :: DebugOption -> String
show :: DebugOption -> String
$cshowList :: [DebugOption] -> ShowS
showList :: [DebugOption] -> ShowS
Show, Int -> DebugOption
DebugOption -> Int
DebugOption -> [DebugOption]
DebugOption -> DebugOption
DebugOption -> DebugOption -> [DebugOption]
DebugOption -> DebugOption -> DebugOption -> [DebugOption]
(DebugOption -> DebugOption)
-> (DebugOption -> DebugOption)
-> (Int -> DebugOption)
-> (DebugOption -> Int)
-> (DebugOption -> [DebugOption])
-> (DebugOption -> DebugOption -> [DebugOption])
-> (DebugOption -> DebugOption -> [DebugOption])
-> (DebugOption -> DebugOption -> DebugOption -> [DebugOption])
-> Enum DebugOption
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: DebugOption -> DebugOption
succ :: DebugOption -> DebugOption
$cpred :: DebugOption -> DebugOption
pred :: DebugOption -> DebugOption
$ctoEnum :: Int -> DebugOption
toEnum :: Int -> DebugOption
$cfromEnum :: DebugOption -> Int
fromEnum :: DebugOption -> Int
$cenumFrom :: DebugOption -> [DebugOption]
enumFrom :: DebugOption -> [DebugOption]
$cenumFromThen :: DebugOption -> DebugOption -> [DebugOption]
enumFromThen :: DebugOption -> DebugOption -> [DebugOption]
$cenumFromTo :: DebugOption -> DebugOption -> [DebugOption]
enumFromTo :: DebugOption -> DebugOption -> [DebugOption]
$cenumFromThenTo :: DebugOption -> DebugOption -> DebugOption -> [DebugOption]
enumFromThenTo :: DebugOption -> DebugOption -> DebugOption -> [DebugOption]
Enum, DebugOption
DebugOption -> DebugOption -> Bounded DebugOption
forall a. a -> a -> Bounded a
$cminBound :: DebugOption
minBound :: DebugOption
$cmaxBound :: DebugOption
maxBound :: DebugOption
Bounded)

debugOptionName :: DebugOption -> String
debugOptionName :: DebugOption -> String
debugOptionName = \case
  DebugOption
ToggleCreative -> String
"creative"
  DebugOption
ToggleWorldEditor -> String
"editor"
  DebugOption
DebugCESK -> String
"cesk"
  DebugOption
ListAllRobots -> String
"all_robots"
  DebugOption
ListRobotIDs -> String
"robot_id"
  DebugOption
ShowHiddenGoals -> String
"hidden_goals"
  DebugOption
LoadTestingScenarios -> String
"testing"

debugOptionDescription :: DebugOption -> String
debugOptionDescription :: DebugOption -> String
debugOptionDescription = \case
  DebugOption
ToggleCreative -> String
"allow toggling creative mode on/off"
  DebugOption
ToggleWorldEditor -> String
"allow toggling the world editor mode on/off"
  DebugOption
DebugCESK -> String
"allow toggling the CESK debug view on/off"
  DebugOption
ListAllRobots -> String
"list all robots (including system robots) in the robot panel"
  DebugOption
ListRobotIDs -> String
"list robot IDs in the robot panel"
  DebugOption
ShowHiddenGoals -> String
"show hidden objectives in the goal dialog"
  DebugOption
LoadTestingScenarios -> String
"load Testing folder in scenarios menu"

readDebugOption :: String -> Maybe DebugOption
readDebugOption :: String -> Maybe DebugOption
readDebugOption String
name = (DebugOption -> Bool) -> [DebugOption] -> Maybe DebugOption
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find ((ShowS
trim String
name String -> String -> Bool
forall a. Eq a => a -> a -> Bool
==) (String -> Bool) -> (DebugOption -> String) -> DebugOption -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DebugOption -> String
debugOptionName) [DebugOption]
forall a. (Enum a, Bounded a) => [a]
enumerate

readDebugOptionList :: String -> Either String [DebugOption]
readDebugOptionList :: String -> Either String [DebugOption]
readDebugOptionList = (Either String [DebugOption]
 -> String -> Either String [DebugOption])
-> Either String [DebugOption]
-> [String]
-> Either String [DebugOption]
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Either String [DebugOption]
-> String -> Either String [DebugOption]
eitherRead ([DebugOption] -> Either String [DebugOption]
forall a b. b -> Either a b
Right []) ([String] -> Either String [DebugOption])
-> (String -> [String]) -> String -> Either String [DebugOption]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> [String]
forall a. (Partial, Eq a) => [a] -> [a] -> [[a]]
splitOn String
","
 where
  eitherRead :: Either String [DebugOption]
-> String -> Either String [DebugOption]
eitherRead Either String [DebugOption]
s String
o = case (Either String [DebugOption]
s, String -> Maybe DebugOption
readDebugOption String
o) of
    (Left String
e, Maybe DebugOption
_) -> String -> Either String [DebugOption]
forall a b. a -> Either a b
Left String
e
    (Either String [DebugOption]
_, Maybe DebugOption
Nothing) -> String -> Either String [DebugOption]
forall a b. a -> Either a b
Left (String -> Either String [DebugOption])
-> String -> Either String [DebugOption]
forall a b. (a -> b) -> a -> b
$ String
"unknown option '" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
o String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"'"
    (Right [DebugOption]
oss, Just DebugOption
os) -> [DebugOption] -> Either String [DebugOption]
forall a b. b -> Either a b
Right ([DebugOption] -> Either String [DebugOption])
-> [DebugOption] -> Either String [DebugOption]
forall a b. (a -> b) -> a -> b
$ DebugOption
os DebugOption -> [DebugOption] -> [DebugOption]
forall a. a -> [a] -> [a]
: [DebugOption]
oss