{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE StrictData        #-}
module HaskellCI.GitHub.Yaml where

import HaskellCI.Prelude

import qualified Data.Map.Strict as M

import HaskellCI.Compiler
import HaskellCI.List
import HaskellCI.Sh
import HaskellCI.YamlSyntax

-------------------------------------------------------------------------------
-- Data
-------------------------------------------------------------------------------

data GitHub = GitHub
    { GitHub -> String
ghName :: String
    , GitHub -> GitHubOn
ghOn   :: GitHubOn
    , GitHub -> Map String GitHubJob
ghJobs :: M.Map String GitHubJob
    }
  deriving (Int -> GitHub -> ShowS
[GitHub] -> ShowS
GitHub -> String
(Int -> GitHub -> ShowS)
-> (GitHub -> String) -> ([GitHub] -> ShowS) -> Show GitHub
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHub -> ShowS
showsPrec :: Int -> GitHub -> ShowS
$cshow :: GitHub -> String
show :: GitHub -> String
$cshowList :: [GitHub] -> ShowS
showList :: [GitHub] -> ShowS
Show)

newtype GitHubOn = GitHubOn
    { GitHubOn -> [String]
ghBranches :: [String]
    }
  deriving (Int -> GitHubOn -> ShowS
[GitHubOn] -> ShowS
GitHubOn -> String
(Int -> GitHubOn -> ShowS)
-> (GitHubOn -> String) -> ([GitHubOn] -> ShowS) -> Show GitHubOn
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubOn -> ShowS
showsPrec :: Int -> GitHubOn -> ShowS
$cshow :: GitHubOn -> String
show :: GitHubOn -> String
$cshowList :: [GitHubOn] -> ShowS
showList :: [GitHubOn] -> ShowS
Show)

data GitHubJob = GitHubJob
    { GitHubJob -> String
ghjName            :: String
    , GitHubJob -> String
ghjRunsOn          :: String
    , GitHubJob -> [String]
ghjNeeds           :: [String]
    , GitHubJob -> Maybe String
ghjIf              :: Maybe String
    , GitHubJob -> Maybe String
ghjContainer       :: Maybe String
    , GitHubJob -> Map String GitHubService
ghjServices        :: M.Map String GitHubService
    , GitHubJob -> Maybe String
ghjContinueOnError :: Maybe String
    , GitHubJob -> [GitHubMatrixEntry]
ghjMatrix          :: [GitHubMatrixEntry]
    , GitHubJob -> [GitHubStep]
ghjSteps           :: [GitHubStep]
    , GitHubJob -> Natural
ghjTimeout         :: Natural
    }
  deriving (Int -> GitHubJob -> ShowS
[GitHubJob] -> ShowS
GitHubJob -> String
(Int -> GitHubJob -> ShowS)
-> (GitHubJob -> String)
-> ([GitHubJob] -> ShowS)
-> Show GitHubJob
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubJob -> ShowS
showsPrec :: Int -> GitHubJob -> ShowS
$cshow :: GitHubJob -> String
show :: GitHubJob -> String
$cshowList :: [GitHubJob] -> ShowS
showList :: [GitHubJob] -> ShowS
Show)

data SetupMethod = HVRPPA | GHCUP
  deriving Int -> SetupMethod -> ShowS
[SetupMethod] -> ShowS
SetupMethod -> String
(Int -> SetupMethod -> ShowS)
-> (SetupMethod -> String)
-> ([SetupMethod] -> ShowS)
-> Show SetupMethod
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SetupMethod -> ShowS
showsPrec :: Int -> SetupMethod -> ShowS
$cshow :: SetupMethod -> String
show :: SetupMethod -> String
$cshowList :: [SetupMethod] -> ShowS
showList :: [SetupMethod] -> ShowS
Show

data GitHubMatrixEntry = GitHubMatrixEntry
    { GitHubMatrixEntry -> CompilerVersion
ghmeCompiler     :: CompilerVersion
    , GitHubMatrixEntry -> Bool
ghmeAllowFailure :: Bool
    , GitHubMatrixEntry -> SetupMethod
ghmeSetupMethod  :: SetupMethod
    }
  deriving (Int -> GitHubMatrixEntry -> ShowS
[GitHubMatrixEntry] -> ShowS
GitHubMatrixEntry -> String
(Int -> GitHubMatrixEntry -> ShowS)
-> (GitHubMatrixEntry -> String)
-> ([GitHubMatrixEntry] -> ShowS)
-> Show GitHubMatrixEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubMatrixEntry -> ShowS
showsPrec :: Int -> GitHubMatrixEntry -> ShowS
$cshow :: GitHubMatrixEntry -> String
show :: GitHubMatrixEntry -> String
$cshowList :: [GitHubMatrixEntry] -> ShowS
showList :: [GitHubMatrixEntry] -> ShowS
Show)

data GitHubStep = GitHubStep
    { GitHubStep -> String
ghsName :: String
    , GitHubStep -> Either GitHubRun GitHubUses
ghsStep :: Either GitHubRun GitHubUses
    }
  deriving (Int -> GitHubStep -> ShowS
[GitHubStep] -> ShowS
GitHubStep -> String
(Int -> GitHubStep -> ShowS)
-> (GitHubStep -> String)
-> ([GitHubStep] -> ShowS)
-> Show GitHubStep
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubStep -> ShowS
showsPrec :: Int -> GitHubStep -> ShowS
$cshow :: GitHubStep -> String
show :: GitHubStep -> String
$cshowList :: [GitHubStep] -> ShowS
showList :: [GitHubStep] -> ShowS
Show)

-- | Steps with @run@
data GitHubRun = GitHubRun
    { GitHubRun -> [Sh]
ghsRun :: [Sh]
    , GitHubRun -> Map String String
ghsEnv :: M.Map String String
    }
  deriving (Int -> GitHubRun -> ShowS
[GitHubRun] -> ShowS
GitHubRun -> String
(Int -> GitHubRun -> ShowS)
-> (GitHubRun -> String)
-> ([GitHubRun] -> ShowS)
-> Show GitHubRun
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubRun -> ShowS
showsPrec :: Int -> GitHubRun -> ShowS
$cshow :: GitHubRun -> String
show :: GitHubRun -> String
$cshowList :: [GitHubRun] -> ShowS
showList :: [GitHubRun] -> ShowS
Show)

-- | Steps with @uses@
data GitHubUses = GitHubUses
    { GitHubUses -> String
ghsAction :: String
    , GitHubUses -> Maybe String
ghsIf     :: Maybe String
    , GitHubUses -> Map String String
ghsWith   :: M.Map String String
    }
  deriving (Int -> GitHubUses -> ShowS
[GitHubUses] -> ShowS
GitHubUses -> String
(Int -> GitHubUses -> ShowS)
-> (GitHubUses -> String)
-> ([GitHubUses] -> ShowS)
-> Show GitHubUses
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubUses -> ShowS
showsPrec :: Int -> GitHubUses -> ShowS
$cshow :: GitHubUses -> String
show :: GitHubUses -> String
$cshowList :: [GitHubUses] -> ShowS
showList :: [GitHubUses] -> ShowS
Show)

data GitHubService = GitHubService
    { GitHubService -> String
ghServImage   :: String
    , GitHubService -> Map String String
ghServEnv     :: M.Map String String
    , GitHubService -> Maybe String
ghServOptions :: Maybe String
    }
  deriving (Int -> GitHubService -> ShowS
[GitHubService] -> ShowS
GitHubService -> String
(Int -> GitHubService -> ShowS)
-> (GitHubService -> String)
-> ([GitHubService] -> ShowS)
-> Show GitHubService
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GitHubService -> ShowS
showsPrec :: Int -> GitHubService -> ShowS
$cshow :: GitHubService -> String
show :: GitHubService -> String
$cshowList :: [GitHubService] -> ShowS
showList :: [GitHubService] -> ShowS
Show)

-------------------------------------------------------------------------------
-- ToYaml
-------------------------------------------------------------------------------

instance ToYaml GitHub where
    toYaml :: GitHub -> Yaml [String]
toYaml GitHub {String
Map String GitHubJob
GitHubOn
ghName :: GitHub -> String
ghOn :: GitHub -> GitHubOn
ghJobs :: GitHub -> Map String GitHubJob
ghName :: String
ghOn :: GitHubOn
ghJobs :: Map String GitHubJob
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        [ String
"name" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghName
        , String
"on"   String -> Yaml [String] -> ([String], String, Yaml [String])
~> GitHubOn -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml GitHubOn
ghOn
        , String
"jobs" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
            [ ([], String
j, GitHubJob -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml GitHubJob
job)
            | (String
j, GitHubJob
job) <- Map String GitHubJob -> [(String, GitHubJob)]
forall k a. Map k a -> [(k, a)]
M.toList Map String GitHubJob
ghJobs
            ]
        ]

instance ToYaml GitHubOn where
    toYaml :: GitHubOn -> Yaml [String]
toYaml GitHubOn {[String]
ghBranches :: GitHubOn -> [String]
ghBranches :: [String]
..}
        | [String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
ghBranches
        = [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] [Yaml [String]
"push", Yaml [String]
"pull_request"]
        | Bool
otherwise
        = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
              [ String
"push"         String -> Yaml [String] -> ([String], String, Yaml [String])
~> Yaml [String]
branches
              , String
"pull_request" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Yaml [String]
branches
              ]
      where
        branches :: Yaml [String]
branches = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
            [ String
"branches" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] ((String -> Yaml [String]) -> [String] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map String -> Yaml [String]
forall a. IsString a => String -> a
fromString [String]
ghBranches)
            ]

instance ToYaml GitHubJob where
    toYaml :: GitHubJob -> Yaml [String]
toYaml GitHubJob {Natural
String
[String]
[GitHubStep]
[GitHubMatrixEntry]
Maybe String
Map String GitHubService
ghjName :: GitHubJob -> String
ghjRunsOn :: GitHubJob -> String
ghjNeeds :: GitHubJob -> [String]
ghjIf :: GitHubJob -> Maybe String
ghjContainer :: GitHubJob -> Maybe String
ghjServices :: GitHubJob -> Map String GitHubService
ghjContinueOnError :: GitHubJob -> Maybe String
ghjMatrix :: GitHubJob -> [GitHubMatrixEntry]
ghjSteps :: GitHubJob -> [GitHubStep]
ghjTimeout :: GitHubJob -> Natural
ghjName :: String
ghjRunsOn :: String
ghjNeeds :: [String]
ghjIf :: Maybe String
ghjContainer :: Maybe String
ghjServices :: Map String GitHubService
ghjContinueOnError :: Maybe String
ghjMatrix :: [GitHubMatrixEntry]
ghjSteps :: [GitHubStep]
ghjTimeout :: Natural
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt [] ([([String], String, Yaml [String])] -> Yaml [String])
-> [([String], String, Yaml [String])] -> Yaml [String]
forall a b. (a -> b) -> a -> b
$ ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder ([String], String, Yaml [String]) ()
 -> [([String], String, Yaml [String])])
-> ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall a b. (a -> b) -> a -> b
$ do
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"name" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghjName
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"runs-on" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghjRunsOn
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"needs" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] ((String -> Yaml [String]) -> [String] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map String -> Yaml [String]
forall a. IsString a => String -> a
fromString [String]
ghjNeeds)
        Maybe String
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe String
ghjIf ((String -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \String
if_ ->
            ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"if" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
if_
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"timeout-minutes" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> Integer -> Yaml [String]
forall ann. ann -> Integer -> Yaml ann
YNumber [] (Natural -> Integer
forall a. Integral a => a -> Integer
toInteger Natural
ghjTimeout)
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"container" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt [] (ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder ([String], String, Yaml [String]) ()
 -> [([String], String, Yaml [String])])
-> ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall a b. (a -> b) -> a -> b
$
            Maybe String
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe String
ghjContainer ((String -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \String
image -> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"image" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
image)
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"services" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Map String GitHubService -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml Map String GitHubService
ghjServices
        Maybe String
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe String
ghjContinueOnError ((String -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \String
continueOnError ->
            ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"continue-on-error" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
continueOnError
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"strategy" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
            [ String
"matrix" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
                [ String
"include" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] ((GitHubMatrixEntry -> Yaml [String])
-> [GitHubMatrixEntry] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map GitHubMatrixEntry -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml [GitHubMatrixEntry]
ghjMatrix)
                ]
            , String
"fail-fast" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> Bool -> Yaml [String]
forall ann. ann -> Bool -> Yaml ann
YBool [] Bool
False
            ]
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"steps" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] ((GitHubStep -> Yaml [String]) -> [GitHubStep] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map GitHubStep -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml ([GitHubStep] -> [Yaml [String]])
-> [GitHubStep] -> [Yaml [String]]
forall a b. (a -> b) -> a -> b
$ (GitHubStep -> Bool) -> [GitHubStep] -> [GitHubStep]
forall a. (a -> Bool) -> [a] -> [a]
filter GitHubStep -> Bool
notEmptyStep [GitHubStep]
ghjSteps)

instance ToYaml SetupMethod where
    toYaml :: SetupMethod -> Yaml [String]
toYaml SetupMethod
HVRPPA = Yaml [String]
"hvr-ppa"
    toYaml SetupMethod
GHCUP  = Yaml [String]
"ghcup"

instance ToYaml GitHubMatrixEntry where
    toYaml :: GitHubMatrixEntry -> Yaml [String]
toYaml GitHubMatrixEntry {Bool
CompilerVersion
SetupMethod
ghmeCompiler :: GitHubMatrixEntry -> CompilerVersion
ghmeAllowFailure :: GitHubMatrixEntry -> Bool
ghmeSetupMethod :: GitHubMatrixEntry -> SetupMethod
ghmeCompiler :: CompilerVersion
ghmeAllowFailure :: Bool
ghmeSetupMethod :: SetupMethod
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        [ String
"compiler"        String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString (CompilerVersion -> String
dispGhcVersion CompilerVersion
ghmeCompiler)
        , String
"compilerKind"    String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString (CompilerVersion -> String
compilerKind CompilerVersion
ghmeCompiler)
        , String
"compilerVersion" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString (CompilerVersion -> String
compilerVersion CompilerVersion
ghmeCompiler)
        , String
"setup-method"    String -> Yaml [String] -> ([String], String, Yaml [String])
~> SetupMethod -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml SetupMethod
ghmeSetupMethod
        , String
"allow-failure"   String -> Yaml [String] -> ([String], String, Yaml [String])
~> Bool -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml Bool
ghmeAllowFailure
        ]

instance ToYaml GitHubStep where
    toYaml :: GitHubStep -> Yaml [String]
toYaml GitHubStep {String
Either GitHubRun GitHubUses
ghsName :: GitHubStep -> String
ghsStep :: GitHubStep -> Either GitHubRun GitHubUses
ghsName :: String
ghsStep :: Either GitHubRun GitHubUses
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt [] ([([String], String, Yaml [String])] -> Yaml [String])
-> [([String], String, Yaml [String])] -> Yaml [String]
forall a b. (a -> b) -> a -> b
$
        [ String
"name" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghsName
        ] [([String], String, Yaml [String])]
-> [([String], String, Yaml [String])]
-> [([String], String, Yaml [String])]
forall a. [a] -> [a] -> [a]
++ case Either GitHubRun GitHubUses
ghsStep of
            Left GitHubRun {[Sh]
Map String String
ghsRun :: GitHubRun -> [Sh]
ghsEnv :: GitHubRun -> Map String String
ghsRun :: [Sh]
ghsEnv :: Map String String
..} ->
                [ String
"run" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString ([Sh] -> String
shlistToString [Sh]
ghsRun)
                , String
"env" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Map String String -> Yaml [String]
mapToYaml Map String String
ghsEnv
                ]

            Right GitHubUses {String
Maybe String
Map String String
ghsAction :: GitHubUses -> String
ghsIf :: GitHubUses -> Maybe String
ghsWith :: GitHubUses -> Map String String
ghsAction :: String
ghsIf :: Maybe String
ghsWith :: Map String String
..} -> ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder ([String], String, Yaml [String]) ()
 -> [([String], String, Yaml [String])])
-> ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall a b. (a -> b) -> a -> b
$ do
                ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"uses" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghsAction
                Maybe String
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe String
ghsIf ((String -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \String
if_ -> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"if" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
if_
                ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"with" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Map String String -> Yaml [String]
mapToYaml Map String String
ghsWith

notEmptyStep :: GitHubStep -> Bool
notEmptyStep :: GitHubStep -> Bool
notEmptyStep (GitHubStep String
_ (Left (GitHubRun [] Map String String
_))) = Bool
False
notEmptyStep GitHubStep
_                                      = Bool
True

instance ToYaml GitHubService where
    toYaml :: GitHubService -> Yaml [String]
toYaml GitHubService {String
Maybe String
Map String String
ghServImage :: GitHubService -> String
ghServEnv :: GitHubService -> Map String String
ghServOptions :: GitHubService -> Maybe String
ghServImage :: String
ghServEnv :: Map String String
ghServOptions :: Maybe String
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt [] ([([String], String, Yaml [String])] -> Yaml [String])
-> [([String], String, Yaml [String])] -> Yaml [String]
forall a b. (a -> b) -> a -> b
$ ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder ([String], String, Yaml [String]) ()
 -> [([String], String, Yaml [String])])
-> ListBuilder ([String], String, Yaml [String]) ()
-> [([String], String, Yaml [String])]
forall a b. (a -> b) -> a -> b
$ do
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"image" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
ghServImage
        ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"env"   String -> Yaml [String] -> ([String], String, Yaml [String])
~> Map String (Yaml [String]) -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml ([String] -> String -> Yaml [String]
forall ann. ann -> String -> Yaml ann
YString [] (String -> Yaml [String])
-> Map String String -> Map String (Yaml [String])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map String String
ghServEnv)
        Maybe String
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe String
ghServOptions ((String -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (String -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \String
opt -> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall x. x -> ListBuilder x ()
item (([String], String, Yaml [String])
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ([String], String, Yaml [String])
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ String
"options" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
opt

-------------------------------------------------------------------------------
-- Helpers
-------------------------------------------------------------------------------

mapToYaml :: M.Map String String -> Yaml [String]
mapToYaml :: Map String String -> Yaml [String]
mapToYaml Map String String
m = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
    [ String
k String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
v
    | (String
k, String
v) <- Map String String -> [(String, String)]
forall k a. Map k a -> [(k, a)]
M.toList Map String String
m
    ]