module BDCS.API.ComposeConfig(
ComposeConfig(..),
parseComposeConfig,
composeConfigTOML
) where
import BDCS.Export.Types(ExportType(..), exportTypeFromText, exportTypeText)
import Data.Aeson
import Data.Maybe(fromMaybe)
import qualified Data.Text as T
import Text.Printf(printf)
import Text.Toml(parseTomlDoc)
data ComposeConfig = ComposeConfig {
ccCommit :: T.Text,
ccExportType :: ExportType
} deriving (Show, Eq)
instance ToJSON ComposeConfig where
toJSON ComposeConfig{..} = object
[ "commit" .= ccCommit
, "export_type" .= exportTypeText ccExportType
]
instance FromJSON ComposeConfig where
parseJSON = withObject "Compose configuration data" $ \o -> do
ccCommit <- o .: "commit"
ccExportType <- (o .: "export_type") >>= \et -> return $ fromMaybe ExportTar $ exportTypeFromText et
return ComposeConfig{..}
parseComposeConfig :: T.Text -> Either String ComposeConfig
parseComposeConfig xs =
case parseTomlDoc "" xs of
Left err -> Left ("Parsing TOML document failed. " ++ show err)
Right table -> do
let jsonValue = toJSON table
case (fromJSON jsonValue :: Result ComposeConfig) of
Error err -> Left ("Converting from JSON to ComposeConfig failed. " ++ show err)
Success r -> Right r
composeConfigTOML :: ComposeConfig -> T.Text
composeConfigTOML ComposeConfig{..} = T.concat [commitText, exportText]
where
commitText = T.pack $ printf "commit = \"%s\"\n" ccCommit
exportText = T.pack $ printf "export_type = \"%s\"\n" (exportTypeText ccExportType)