{- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/. -} -- | Configuration file. module SlackBuilder.Config ( CloneSettings(..) , DownloaderSettings(..) , Settings(..) , MaintainerSettings(..) , PackageSettings(..) , settingsCodec ) where import Data.List.NonEmpty (NonEmpty(..)) import Data.Text (Text) import Toml ((.=)) import qualified Toml import GHC.Records (HasField(..)) data Settings = Settings { ghToken :: !Text , repository :: !FilePath , branch :: Text , downloadURL :: Text , uploadCommand :: NonEmpty Text , maintainer :: MaintainerSettings , packages :: [PackageSettings] } deriving (Eq, Show) newtype MaintainerSettings = MaintainerSettings { signature :: Bool } deriving (Eq, Show) data DownloaderSettings = DownloaderSettings { name :: Text , is64 :: Bool , version :: Text , template :: Maybe Text , clone :: Maybe CloneSettings , github :: Maybe (Text, Text) , packagist :: Maybe (Text, Text) , text :: Maybe (Text, [String]) , repackage :: Maybe [String] } deriving (Eq, Show) data PackageSettings = PackageSettings { downloader :: DownloaderSettings , downloaders :: [DownloaderSettings] } deriving (Eq, Show) data CloneSettings = CloneSettings { remote :: Text , tagTemplate :: Text } deriving (Eq, Show) settingsCodec :: Toml.TomlCodec Settings settingsCodec = Settings <$> Toml.text "gh_token" .= ghToken <*> Toml.string "repository" .= repository <*> Toml.text "branch" .= branch <*> Toml.text "download_url" .= downloadURL <*> Toml.arrayNonEmptyOf Toml._Text "upload_command" .= uploadCommand <*> Toml.table maintainerSettingsCodec "maintainer" .= maintainer <*> Toml.list packageSettingsCodec "package" .= packages maintainerSettingsCodec :: Toml.TomlCodec MaintainerSettings maintainerSettingsCodec = MaintainerSettings <$> Toml.bool "signature" .= signature downloaderSettingsCodec :: Toml.TomlCodec DownloaderSettings downloaderSettingsCodec = DownloaderSettings <$> Toml.text "name" .= name <*> Toml.bool "is64" .= is64 <*> Toml.text "version" .= version <*> Toml.dioptional (Toml.text "template") .= template <*> Toml.dioptional (Toml.table cloneSettingsCodec "clone") .= clone <*> Toml.dioptional (Toml.table githubCodec "github") .= github <*> Toml.dioptional (Toml.table packagistCodec "packagist") .= packagist <*> Toml.dioptional (Toml.table textCodec "text") .= text <*> Toml.dioptional (Toml.arrayOf Toml._String "repackage") .= repackage where githubCodec = Toml.pair (Toml.text "owner") (Toml.text "name") packagistCodec = Toml.pair (Toml.text "owner") (Toml.text "name") textCodec = Toml.pair (Toml.text "url") (Toml.arrayOf Toml._String "picker") packageSettingsCodec :: Toml.TomlCodec PackageSettings packageSettingsCodec = PackageSettings <$> downloaderSettingsCodec .= getField @"downloader" <*> Toml.list downloaderSettingsCodec "downloader" .= downloaders cloneSettingsCodec :: Toml.TomlCodec CloneSettings cloneSettingsCodec = CloneSettings <$> Toml.text "remote" .= remote <*> Toml.text "tag_template" .= tagTemplate