-- cabal-helper: Simple interface to Cabal's configuration state
-- Copyright (C) 2020  Daniel Gröber <cabal-helper@dxld.at>
--
-- SPDX-License-Identifier: Apache-2.0
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0

{-|
Module      : CabalHelper.Compiletime.Types.Cabal
License     : Apache-2.0
-}

{-# LANGUAGE DeriveFunctor #-}

module CabalHelper.Compiletime.Types.Cabal where

import Data.Version

-- | Cabal library version we're compiling the helper exe against.
data CabalVersion' a
    = CabalHEAD a
    | CabalVersion { CabalVersion' a -> Version
cvVersion :: Version }
      deriving (CabalVersion' a -> CabalVersion' a -> Bool
(CabalVersion' a -> CabalVersion' a -> Bool)
-> (CabalVersion' a -> CabalVersion' a -> Bool)
-> Eq (CabalVersion' a)
forall a. Eq a => CabalVersion' a -> CabalVersion' a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CabalVersion' a -> CabalVersion' a -> Bool
$c/= :: forall a. Eq a => CabalVersion' a -> CabalVersion' a -> Bool
== :: CabalVersion' a -> CabalVersion' a -> Bool
$c== :: forall a. Eq a => CabalVersion' a -> CabalVersion' a -> Bool
Eq, Eq (CabalVersion' a)
Eq (CabalVersion' a)
-> (CabalVersion' a -> CabalVersion' a -> Ordering)
-> (CabalVersion' a -> CabalVersion' a -> Bool)
-> (CabalVersion' a -> CabalVersion' a -> Bool)
-> (CabalVersion' a -> CabalVersion' a -> Bool)
-> (CabalVersion' a -> CabalVersion' a -> Bool)
-> (CabalVersion' a -> CabalVersion' a -> CabalVersion' a)
-> (CabalVersion' a -> CabalVersion' a -> CabalVersion' a)
-> Ord (CabalVersion' a)
CabalVersion' a -> CabalVersion' a -> Bool
CabalVersion' a -> CabalVersion' a -> Ordering
CabalVersion' a -> CabalVersion' a -> CabalVersion' a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (CabalVersion' a)
forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Bool
forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Ordering
forall a.
Ord a =>
CabalVersion' a -> CabalVersion' a -> CabalVersion' a
min :: CabalVersion' a -> CabalVersion' a -> CabalVersion' a
$cmin :: forall a.
Ord a =>
CabalVersion' a -> CabalVersion' a -> CabalVersion' a
max :: CabalVersion' a -> CabalVersion' a -> CabalVersion' a
$cmax :: forall a.
Ord a =>
CabalVersion' a -> CabalVersion' a -> CabalVersion' a
>= :: CabalVersion' a -> CabalVersion' a -> Bool
$c>= :: forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Bool
> :: CabalVersion' a -> CabalVersion' a -> Bool
$c> :: forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Bool
<= :: CabalVersion' a -> CabalVersion' a -> Bool
$c<= :: forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Bool
< :: CabalVersion' a -> CabalVersion' a -> Bool
$c< :: forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Bool
compare :: CabalVersion' a -> CabalVersion' a -> Ordering
$ccompare :: forall a. Ord a => CabalVersion' a -> CabalVersion' a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (CabalVersion' a)
Ord, a -> CabalVersion' b -> CabalVersion' a
(a -> b) -> CabalVersion' a -> CabalVersion' b
(forall a b. (a -> b) -> CabalVersion' a -> CabalVersion' b)
-> (forall a b. a -> CabalVersion' b -> CabalVersion' a)
-> Functor CabalVersion'
forall a b. a -> CabalVersion' b -> CabalVersion' a
forall a b. (a -> b) -> CabalVersion' a -> CabalVersion' b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> CabalVersion' b -> CabalVersion' a
$c<$ :: forall a b. a -> CabalVersion' b -> CabalVersion' a
fmap :: (a -> b) -> CabalVersion' a -> CabalVersion' b
$cfmap :: forall a b. (a -> b) -> CabalVersion' a -> CabalVersion' b
Functor)

newtype CommitId = CommitId { CommitId -> String
unCommitId :: String }

type UnpackedCabalVersion = CabalVersion' (CommitId, CabalSourceDir)
type ResolvedCabalVersion = CabalVersion' CommitId
type CabalVersion = CabalVersion' ()

data UnpackCabalVariant = Pristine | LatestRevision
newtype CabalSourceDir = CabalSourceDir { CabalSourceDir -> String
unCabalSourceDir :: FilePath }


unpackedToResolvedCabalVersion :: UnpackedCabalVersion -> ResolvedCabalVersion
unpackedToResolvedCabalVersion :: UnpackedCabalVersion -> ResolvedCabalVersion
unpackedToResolvedCabalVersion (CabalHEAD (CommitId
commit, CabalSourceDir
_)) = CommitId -> ResolvedCabalVersion
forall a. a -> CabalVersion' a
CabalHEAD CommitId
commit
unpackedToResolvedCabalVersion (CabalVersion Version
ver) = Version -> ResolvedCabalVersion
forall a. Version -> CabalVersion' a
CabalVersion Version
ver

showUnpackedCabalVersion :: UnpackedCabalVersion -> String
showUnpackedCabalVersion :: UnpackedCabalVersion -> String
showUnpackedCabalVersion (CabalHEAD (CommitId
commitid, CabalSourceDir
_)) =
  String
"HEAD-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ CommitId -> String
unCommitId CommitId
commitid
showUnpackedCabalVersion CabalVersion {Version
cvVersion :: Version
cvVersion :: forall a. CabalVersion' a -> Version
cvVersion} =
  Version -> String
showVersion Version
cvVersion

showResolvedCabalVersion :: ResolvedCabalVersion -> String
showResolvedCabalVersion :: ResolvedCabalVersion -> String
showResolvedCabalVersion (CabalHEAD CommitId
commitid) =
  String
"HEAD-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ CommitId -> String
unCommitId CommitId
commitid
showResolvedCabalVersion CabalVersion {Version
cvVersion :: Version
cvVersion :: forall a. CabalVersion' a -> Version
cvVersion} =
  Version -> String
showVersion Version
cvVersion

showCabalVersion :: CabalVersion -> String
showCabalVersion :: CabalVersion -> String
showCabalVersion (CabalHEAD ()) =
  String
"HEAD"
showCabalVersion CabalVersion {Version
cvVersion :: Version
cvVersion :: forall a. CabalVersion' a -> Version
cvVersion} =
  Version -> String
showVersion Version
cvVersion