ddc-tools-0.4.2.2: src/ddci-tetra/DDCI/Tetra/Command/Set.hs
module DDCI.Tetra.Command.Set
(cmdSet)
where
import DDCI.Tetra.State
import DDCI.Tetra.Mode
import DDC.Base.Pretty
import Data.Char
import Data.List
import qualified DDC.Build.Builder as Build
import qualified Data.Set as Set
cmdSet :: State -> String -> IO State
cmdSet state []
= do putDocLn RenderIndent
$ vcat [ text "Modes: "
<> text (show $ Set.toList $ stateModes state) ]
return state
cmdSet state cmd
| "builder" : name : [] <- words cmd
= do config <- getDefaultBuilderConfig
mHost <- Build.determineDefaultBuilderHost
case mHost of
Nothing
-> do putStrLn "cannot determine build environment"
return state
Just host
-> case find (\b -> Build.builderName b == name)
(Build.builders config host) of
Nothing
-> do putStrLn "unknown builder"
return state
Just builder
-> do putStrLn "ok"
return state { stateBuilder = Just builder }
| otherwise
= case parseModeChanges cmd of
Just changes
-> do let state' = foldr (uncurry adjustMode) state changes
putStrLn "ok"
return state'
Nothing
-> do putStrLn "mode parse error"
return state
-- | Parse a string of mode changes.
parseModeChanges :: String -> Maybe [(Bool, Mode)]
parseModeChanges str
= sequence $ map parseModeChange $ words str
-- | Parse a mode change setting.
-- "Mode" or "+Mode" to enable. "-Mode" to disable.
parseModeChange :: String -> Maybe (Bool, Mode)
parseModeChange str
= case str of
('+' : strMode)
| Just mode <- readMode strMode
-> Just (True, mode)
('/' : strMode)
| Just mode <- readMode strMode
-> Just (False, mode)
(c : strMode)
| isUpper c
, Just mode <- readMode (c : strMode)
-> Just (True, mode)
_ -> Nothing