mirror of
https://github.com/input-output-hk/foliage.git
synced 2024-12-02 07:54:45 +03:00
48 lines
1.0 KiB
Haskell
48 lines
1.0 KiB
Haskell
module Config
|
|
( Config (..),
|
|
Source (..),
|
|
readConfig,
|
|
)
|
|
where
|
|
|
|
import Data.List.NonEmpty as NE
|
|
import Data.Text (Text)
|
|
import Toml (TomlCodec, (.=)) -- add 'TomlBiMap' and 'Key' here optionally
|
|
import Toml qualified
|
|
|
|
newtype Config = Config
|
|
{ configSources :: [Source]
|
|
}
|
|
deriving (Show)
|
|
|
|
configCodec :: TomlCodec Config
|
|
configCodec =
|
|
Config
|
|
<$> Toml.list sourceCodec "sources" .= configSources
|
|
|
|
data Source = Source
|
|
{ sourceUrl :: Text,
|
|
sourceSubdirs :: [Text]
|
|
}
|
|
deriving (Show)
|
|
|
|
sourceCodec :: TomlCodec Source
|
|
sourceCodec =
|
|
Source
|
|
<$> Toml.text "url" .= sourceUrl
|
|
<*> subdirsCodec .= sourceSubdirs
|
|
|
|
subdirsCodec :: TomlCodec [Text]
|
|
subdirsCodec =
|
|
Toml.dimap
|
|
NE.nonEmpty
|
|
(maybe [] toList)
|
|
(Toml.dioptional $ Toml.arrayNonEmptyOf Toml._Text "subdirs")
|
|
|
|
readConfig :: FilePath -> IO (Either String Config)
|
|
readConfig fp = do
|
|
tomlRes <- Toml.decodeFileEither configCodec fp
|
|
return $ case tomlRes of
|
|
Left e -> Left (show e)
|
|
Right settings -> Right settings
|