module SlackBuilder.Package ( DownloadPlaceholder(..) , Download(..) , DownloadTemplate(..) , Package(..) , PackageInfo(..) , Maintainer(..) , Updater(..) , renderDownloadWithVersion ) where import Data.List.NonEmpty (NonEmpty(..)) import Data.Text (Text) import qualified Data.Text as Text import Text.URI (URI(..)) import qualified Text.URI as URI import Crypto.Hash (Digest, MD5) import SlackBuilder.Trans import Control.Monad.Catch (MonadThrow) -- | Contains information how a package can be updated. data Package = Package { latest :: Updater , downloaders :: [Updater] , category :: Text , name :: Text } -- | Download URI with the MD5 checksum of the target. data Download = Download { download :: URI , md5sum :: Digest MD5 , is64 :: Bool } deriving (Eq, Show) -- | Data used to generate an .info file. data PackageInfo = PackageInfo { path :: FilePath , version :: Text , homepage :: Text , requires :: [Text] , maintainer :: Maintainer } deriving (Eq, Show) -- | Package maintainer information. data Maintainer = Maintainer { name :: Text , email :: Text } deriving (Eq, Show) -- | Appears in the download URI template and specifies which part of the URI -- should be replaced with the package version. data DownloadPlaceholder = StaticPlaceholder Text | VersionPlaceholder deriving Eq instance Show DownloadPlaceholder where show (StaticPlaceholder staticPlaceholder) = Text.unpack staticPlaceholder show VersionPlaceholder = "{version}" -- | List of URI components, including version placeholders. newtype DownloadTemplate = DownloadTemplate (NonEmpty DownloadPlaceholder) deriving Eq instance Show DownloadTemplate where show (DownloadTemplate components) = concatMap show components -- | Replaces placeholders in the URL template with the given version. renderDownloadWithVersion :: MonadThrow m => DownloadTemplate -> Text -> m URI renderDownloadWithVersion (DownloadTemplate components) version = URI.mkURI $ foldr f "" components where f (StaticPlaceholder staticPlaceholder) = (staticPlaceholder <>) f VersionPlaceholder = (version <>) -- | Function used to get the latest version of a source. data Updater = Updater { detectLatest :: SlackBuilderT (Maybe Text) , getVersion :: Text -> Text -> SlackBuilderT (URI, Digest MD5) }