packages feed

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