module Git.Fmt.Config (
Config(..),
emptyConfig,
Program(..),
emptyProgram, programFor, unsafeProgramFor, supported,
fileName,
) where
import Data.Aeson.Types
import Data.HashMap.Lazy (toList)
import Data.List (find)
import Data.Maybe (fromJust, isJust)
import Data.Text (Text)
data Config = Config {
programs :: [Program]
}
deriving (Eq, Show)
instance FromJSON Config where
parseJSON (Object obj) = Config <$> mapM (\(key, value) ->
parseJSON value >>= \program -> return program { name = key }
) (toList obj)
parseJSON value = typeMismatch "Config" value
emptyConfig :: Config
emptyConfig = Config []
data Program = Program {
name :: Text,
extensions :: [Text],
command :: Text
}
deriving (Eq, Show)
instance FromJSON Program where
parseJSON (Object obj) = Program "" <$> obj .: "extensions" <*> obj .: "command"
parseJSON value = typeMismatch "Program" value
emptyProgram :: Program
emptyProgram = Program "" [] "false"
programFor :: Config -> Text -> Maybe Program
programFor config ext = find (\program -> ext `elem` extensions program) (programs config)
unsafeProgramFor :: Config -> Text -> Program
unsafeProgramFor config = fromJust . programFor config
supported :: Config -> Text -> Bool
supported config = isJust . programFor config
fileName :: String
fileName = ".omnifmt.yaml"