{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
{-# LANGUAGE StrictData        #-}
-- | @travis.yaml@ structure.
module HaskellCI.Travis.Yaml where

import HaskellCI.Prelude

import qualified Data.Aeson         as Aeson
import qualified Data.List.NonEmpty as NE

import HaskellCI.Config.Ubuntu
import HaskellCI.List
import HaskellCI.Sh
import HaskellCI.YamlSyntax

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

data Travis = Travis
    { Travis -> Ubuntu
travisUbuntu        :: !Ubuntu
    , Travis -> String
travisLanguage      :: !String
    , Travis -> TravisGit
travisGit           :: !TravisGit
    , Travis -> TravisCache
travisCache         :: !TravisCache
    , Travis -> TravisBranches
travisBranches      :: !TravisBranches
    , Travis -> TravisNotifications
travisNotifications :: !TravisNotifications
    , Travis -> [String]
travisServices      :: ![String]
    , Travis -> TravisAddons
travisAddons        :: !TravisAddons
    , Travis -> TravisMatrix
travisMatrix        :: !TravisMatrix
    , Travis -> [Sh]
travisBeforeCache   :: ![Sh]
    , Travis -> [Sh]
travisBeforeInstall :: ![Sh]
    , Travis -> [Sh]
travisInstall       :: ![Sh]
    , Travis -> [Sh]
travisScript        :: ![Sh]
    }
  deriving Int -> Travis -> ShowS
[Travis] -> ShowS
Travis -> String
(Int -> Travis -> ShowS)
-> (Travis -> String) -> ([Travis] -> ShowS) -> Show Travis
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Travis -> ShowS
showsPrec :: Int -> Travis -> ShowS
$cshow :: Travis -> String
show :: Travis -> String
$cshowList :: [Travis] -> ShowS
showList :: [Travis] -> ShowS
Show

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

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

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

data TravisNotifications = TravisNotifications
    { TravisNotifications -> Maybe TravisIRC
tnIRC   :: Maybe TravisIRC
    , TravisNotifications -> Bool
tnEmail :: Bool
    }
  deriving Int -> TravisNotifications -> ShowS
[TravisNotifications] -> ShowS
TravisNotifications -> String
(Int -> TravisNotifications -> ShowS)
-> (TravisNotifications -> String)
-> ([TravisNotifications] -> ShowS)
-> Show TravisNotifications
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisNotifications -> ShowS
showsPrec :: Int -> TravisNotifications -> ShowS
$cshow :: TravisNotifications -> String
show :: TravisNotifications -> String
$cshowList :: [TravisNotifications] -> ShowS
showList :: [TravisNotifications] -> ShowS
Show

data TravisIRC = TravisIRC
    { TravisIRC -> [String]
tiChannels :: [String]
    , TravisIRC -> Bool
tiSkipJoin :: Bool
    , TravisIRC -> [String]
tiTemplate :: [String]
    , TravisIRC -> Maybe String
tiNick     :: Maybe String
    , TravisIRC -> Maybe String
tiPassword :: Maybe String
    }
  deriving Int -> TravisIRC -> ShowS
[TravisIRC] -> ShowS
TravisIRC -> String
(Int -> TravisIRC -> ShowS)
-> (TravisIRC -> String)
-> ([TravisIRC] -> ShowS)
-> Show TravisIRC
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisIRC -> ShowS
showsPrec :: Int -> TravisIRC -> ShowS
$cshow :: TravisIRC -> String
show :: TravisIRC -> String
$cshowList :: [TravisIRC] -> ShowS
showList :: [TravisIRC] -> ShowS
Show

data TravisMatrix = TravisMatrix
    { TravisMatrix -> [TravisJob]
tmInclude       :: [TravisJob]
    , TravisMatrix -> [TravisAllowFailure]
tmAllowFailures :: [TravisAllowFailure]
    }
  deriving Int -> TravisMatrix -> ShowS
[TravisMatrix] -> ShowS
TravisMatrix -> String
(Int -> TravisMatrix -> ShowS)
-> (TravisMatrix -> String)
-> ([TravisMatrix] -> ShowS)
-> Show TravisMatrix
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisMatrix -> ShowS
showsPrec :: Int -> TravisMatrix -> ShowS
$cshow :: TravisMatrix -> String
show :: TravisMatrix -> String
$cshowList :: [TravisMatrix] -> ShowS
showList :: [TravisMatrix] -> ShowS
Show

data TravisJob = TravisJob
    { TravisJob -> String
tjCompiler :: String
    , TravisJob -> Maybe String
tjEnv      :: Maybe String
    , TravisJob -> TravisAddons
tjAddons   :: TravisAddons
    , TravisJob -> String
tjOS       :: String
    }
  deriving Int -> TravisJob -> ShowS
[TravisJob] -> ShowS
TravisJob -> String
(Int -> TravisJob -> ShowS)
-> (TravisJob -> String)
-> ([TravisJob] -> ShowS)
-> Show TravisJob
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisJob -> ShowS
showsPrec :: Int -> TravisJob -> ShowS
$cshow :: TravisJob -> String
show :: TravisJob -> String
$cshowList :: [TravisJob] -> ShowS
showList :: [TravisJob] -> ShowS
Show

data TravisAddons = TravisAddons
    { TravisAddons -> TravisApt
taApt          :: TravisApt
    , TravisAddons -> Maybe String
taPostgres     :: Maybe String
    , TravisAddons -> Bool
taGoogleChrome :: Bool
    }
  deriving Int -> TravisAddons -> ShowS
[TravisAddons] -> ShowS
TravisAddons -> String
(Int -> TravisAddons -> ShowS)
-> (TravisAddons -> String)
-> ([TravisAddons] -> ShowS)
-> Show TravisAddons
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisAddons -> ShowS
showsPrec :: Int -> TravisAddons -> ShowS
$cshow :: TravisAddons -> String
show :: TravisAddons -> String
$cshowList :: [TravisAddons] -> ShowS
showList :: [TravisAddons] -> ShowS
Show

data TravisApt = TravisApt
    { TravisApt -> [String]
taPackages :: [String]
    , TravisApt -> [TravisAptSource]
taSources  :: [TravisAptSource]
    }
  deriving Int -> TravisApt -> ShowS
[TravisApt] -> ShowS
TravisApt -> String
(Int -> TravisApt -> ShowS)
-> (TravisApt -> String)
-> ([TravisApt] -> ShowS)
-> Show TravisApt
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisApt -> ShowS
showsPrec :: Int -> TravisApt -> ShowS
$cshow :: TravisApt -> String
show :: TravisApt -> String
$cshowList :: [TravisApt] -> ShowS
showList :: [TravisApt] -> ShowS
Show

data TravisAptSource
    = TravisAptSource String
    | TravisAptSourceLine String (Maybe String) -- ^ sourceline with optional key
  deriving Int -> TravisAptSource -> ShowS
[TravisAptSource] -> ShowS
TravisAptSource -> String
(Int -> TravisAptSource -> ShowS)
-> (TravisAptSource -> String)
-> ([TravisAptSource] -> ShowS)
-> Show TravisAptSource
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TravisAptSource -> ShowS
showsPrec :: Int -> TravisAptSource -> ShowS
$cshow :: TravisAptSource -> String
show :: TravisAptSource -> String
$cshowList :: [TravisAptSource] -> ShowS
showList :: [TravisAptSource] -> ShowS
Show

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

-------------------------------------------------------------------------------
-- Serialisation helpers (move to Travis.Yaml?)
-------------------------------------------------------------------------------

(^^^) :: ([String], String, Yaml [String]) -> String -> ([String], String, Yaml [String])
([String]
a,String
b,Yaml [String]
c) ^^^ :: ([String], String, Yaml [String])
-> String -> ([String], String, Yaml [String])
^^^ String
d = (String
d String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
a, String
b, Yaml [String]
c)

shListToYaml :: [Sh] -> Yaml [String]
shListToYaml :: [Sh] -> Yaml [String]
shListToYaml [Sh]
shs = [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
YList [] ([Yaml [String]] -> Yaml [String])
-> [Yaml [String]] -> Yaml [String]
forall a b. (a -> b) -> a -> b
$ [[Yaml [String]]] -> [Yaml [String]]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ [String] -> String -> Yaml [String]
forall ann. ann -> String -> Yaml ann
YString [String]
cs String
x Yaml [String] -> [Yaml [String]] -> [Yaml [String]]
forall a. a -> [a] -> [a]
: (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]
xs
    | ([String]
cs, String
x :| [String]
xs) <- [Sh] -> [([String], NonEmpty String)]
gr [Sh]
shs
    ]
  where
    gr :: [Sh] -> [([String], NonEmpty String)]
    gr :: [Sh] -> [([String], NonEmpty String)]
gr [] = []
    gr (Sh String
x : [Sh]
rest) = case [Sh] -> [([String], NonEmpty String)]
gr [Sh]
rest of
        ([], NonEmpty String
xs) : [([String], NonEmpty String)]
xss -> ([], String -> NonEmpty String -> NonEmpty String
forall a. a -> NonEmpty a -> NonEmpty a
NE.cons String
x NonEmpty String
xs) ([String], NonEmpty String)
-> [([String], NonEmpty String)] -> [([String], NonEmpty String)]
forall a. a -> [a] -> [a]
: [([String], NonEmpty String)]
xss
        [([String], NonEmpty String)]
xss            -> ([], String -> NonEmpty String
forall a. a -> NonEmpty a
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
x) ([String], NonEmpty String)
-> [([String], NonEmpty String)] -> [([String], NonEmpty String)]
forall a. a -> [a] -> [a]
: [([String], NonEmpty String)]
xss

    gr (Comment String
c : [Sh]
rest) = case [Sh] -> [([String], NonEmpty String)]
gr [Sh]
rest of
        ([String]
cs, NonEmpty String
xs) : [([String], NonEmpty String)]
xss -> (String
c String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
cs, NonEmpty String
xs) ([String], NonEmpty String)
-> [([String], NonEmpty String)] -> [([String], NonEmpty String)]
forall a. a -> [a] -> [a]
: [([String], NonEmpty String)]
xss
        []             -> [] -- end of comments are lost

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

instance ToYaml Travis where
    toYaml :: Travis -> Yaml [String]
toYaml Travis {String
[String]
[Sh]
Ubuntu
TravisAddons
TravisMatrix
TravisNotifications
TravisBranches
TravisCache
TravisGit
travisUbuntu :: Travis -> Ubuntu
travisLanguage :: Travis -> String
travisGit :: Travis -> TravisGit
travisCache :: Travis -> TravisCache
travisBranches :: Travis -> TravisBranches
travisNotifications :: Travis -> TravisNotifications
travisServices :: Travis -> [String]
travisAddons :: Travis -> TravisAddons
travisMatrix :: Travis -> TravisMatrix
travisBeforeCache :: Travis -> [Sh]
travisBeforeInstall :: Travis -> [Sh]
travisInstall :: Travis -> [Sh]
travisScript :: Travis -> [Sh]
travisUbuntu :: Ubuntu
travisLanguage :: String
travisGit :: TravisGit
travisCache :: TravisCache
travisBranches :: TravisBranches
travisNotifications :: TravisNotifications
travisServices :: [String]
travisAddons :: TravisAddons
travisMatrix :: TravisMatrix
travisBeforeCache :: [Sh]
travisBeforeInstall :: [Sh]
travisInstall :: [Sh]
travisScript :: [Sh]
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        -- version forces validation
        -- https://blog.travis-ci.com/2019-10-24-build-config-validation
        [ String
"version"        String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
"~> 1.0"
        , String
"language"       String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
travisLanguage
        , String
"os"             String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
"linux"
        , String
"dist"           String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString (Ubuntu -> String
showUbuntu Ubuntu
travisUbuntu)
        , String
"git"            String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisGit -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisGit
travisGit
        , String
"branches"       String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisBranches -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisBranches
travisBranches
        , String
"notifications"  String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisNotifications -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisNotifications
travisNotifications
        , String
"services"       String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
YList [] ((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]
travisServices)
        , String
"addons"         String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisAddons -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisAddons
travisAddons
        , String
"cache"          String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisCache -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisCache
travisCache
        , String
"before_cache"   String -> Yaml [String] -> ([String], String, Yaml [String])
~> [Sh] -> Yaml [String]
shListToYaml [Sh]
travisBeforeCache
        , String
"jobs"           String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisMatrix -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisMatrix
travisMatrix
        , String
"before_install" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [Sh] -> Yaml [String]
shListToYaml [Sh]
travisBeforeInstall
        , String
"install"        String -> Yaml [String] -> ([String], String, Yaml [String])
~> [Sh] -> Yaml [String]
shListToYaml [Sh]
travisInstall
        , String
"script"         String -> Yaml [String] -> ([String], String, Yaml [String])
~> [Sh] -> Yaml [String]
shListToYaml [Sh]
travisScript
        ]

instance ToYaml TravisGit where
    toYaml :: TravisGit -> Yaml [String]
toYaml TravisGit {Bool
tgSubmodules :: TravisGit -> Bool
tgSubmodules :: Bool
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        [ String
"submodules" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Bool -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml Bool
tgSubmodules
          ([String], String, Yaml [String])
-> String -> ([String], String, Yaml [String])
^^^ String
"whether to recursively clone submodules"
        ]

instance ToYaml TravisBranches where
    toYaml :: TravisBranches -> Yaml [String]
toYaml TravisBranches {[String]
tbOnly :: TravisBranches -> [String]
tbOnly :: [String]
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        [ String
"only" 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]
tbOnly)
        ]

instance ToYaml TravisNotifications where
    toYaml :: TravisNotifications -> Yaml [String]
toYaml TravisNotifications {Bool
Maybe TravisIRC
tnIRC :: TravisNotifications -> Maybe TravisIRC
tnEmail :: TravisNotifications -> Bool
tnIRC :: Maybe TravisIRC
tnEmail :: Bool
..} = [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
        Maybe TravisIRC
-> (TravisIRC -> 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 TravisIRC
tnIRC ((TravisIRC -> ListBuilder ([String], String, Yaml [String]) ())
 -> ListBuilder ([String], String, Yaml [String]) ())
-> (TravisIRC -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ \TravisIRC
y -> ([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
"irc" String -> Yaml [String] -> ([String], String, Yaml [String])
~> TravisIRC -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml TravisIRC
y
        Bool
-> ListBuilder ([String], String, Yaml [String]) ()
-> ListBuilder ([String], String, Yaml [String]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
tnEmail (ListBuilder ([String], String, Yaml [String]) ()
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$ ([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
"email" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Bool -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml Bool
False

instance ToYaml TravisIRC where
    toYaml :: TravisIRC -> Yaml [String]
toYaml TravisIRC {Bool
[String]
Maybe String
tiChannels :: TravisIRC -> [String]
tiSkipJoin :: TravisIRC -> Bool
tiTemplate :: TravisIRC -> [String]
tiNick :: TravisIRC -> Maybe String
tiPassword :: TravisIRC -> Maybe String
tiChannels :: [String]
tiSkipJoin :: Bool
tiTemplate :: [String]
tiNick :: Maybe String
tiPassword :: 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
"channels"  String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
YList [] ((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]
tiChannels)
        ([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
"skip_join" String -> Yaml [String] -> ([String], String, Yaml [String])
~> Bool -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml Bool
tiSkipJoin
        ([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
"template"  String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
YList [] ((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]
tiTemplate)
        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
tiNick ((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
n ->
            ([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
"nick" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
n
        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
tiPassword ((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
p ->
            ([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
"password" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
p

instance ToYaml TravisCache where
    toYaml :: TravisCache -> Yaml [String]
toYaml TravisCache {[String]
tcDirectories :: TravisCache -> [String]
tcDirectories :: [String]
..} = [String] -> [([String], String, Yaml [String])] -> Yaml [String]
forall ann. ann -> [(ann, String, Yaml ann)] -> Yaml ann
ykeyValuesFilt []
        [ String
"directories" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt []
            [ String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
d
            | String
d <- [String]
tcDirectories
            ]
        ]

instance ToYaml TravisMatrix where
    toYaml :: TravisMatrix -> Yaml [String]
toYaml TravisMatrix {[TravisAllowFailure]
[TravisJob]
tmInclude :: TravisMatrix -> [TravisJob]
tmAllowFailures :: TravisMatrix -> [TravisAllowFailure]
tmInclude :: [TravisJob]
tmAllowFailures :: [TravisAllowFailure]
..} = [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 [] ((TravisJob -> Yaml [String]) -> [TravisJob] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map TravisJob -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml [TravisJob]
tmInclude)
        , String
"allow_failures" String -> Yaml [String] -> ([String], String, Yaml [String])
~> [String] -> [Yaml [String]] -> Yaml [String]
forall ann. ann -> [Yaml ann] -> Yaml ann
ylistFilt [] ((TravisAllowFailure -> Yaml [String])
-> [TravisAllowFailure] -> [Yaml [String]]
forall a b. (a -> b) -> [a] -> [b]
map TravisAllowFailure -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml [TravisAllowFailure]
tmAllowFailures)
        ]

instance ToYaml TravisJob where
    toYaml :: TravisJob -> Yaml [String]
toYaml TravisJob {String
Maybe String
TravisAddons
tjCompiler :: TravisJob -> String
tjEnv :: TravisJob -> Maybe String
tjAddons :: TravisJob -> TravisAddons
tjOS :: TravisJob -> String
tjCompiler :: String
tjEnv :: Maybe String
tjAddons :: TravisAddons
tjOS :: 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
"compiler" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
tjCompiler
        ([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
"addons"   String -> Yaml [String] -> ([String], String, Yaml [String])
~> Value -> Yaml [String]
forall a. ToYaml a => a -> Yaml [String]
toYaml (TravisAddons -> Value
forall a. ToJSON a => a -> Value
Aeson.toJSON TravisAddons
tjAddons)
        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
tjEnv ((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
e ->
            ([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])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
e
        ([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
"os" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
tjOS

instance ToYaml TravisAllowFailure where
    toYaml :: TravisAllowFailure -> Yaml [String]
toYaml TravisAllowFailure {String
tafCompiler :: TravisAllowFailure -> String
tafCompiler :: String
..} = [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 String
tafCompiler
        ]

instance ToYaml TravisAddons where
    toYaml :: TravisAddons -> Yaml [String]
toYaml TravisAddons {Bool
Maybe String
TravisApt
taApt :: TravisAddons -> TravisApt
taPostgres :: TravisAddons -> Maybe String
taGoogleChrome :: TravisAddons -> Bool
taApt :: TravisApt
taPostgres :: Maybe String
taGoogleChrome :: Bool
..} = [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
        -- no apt on purpose
        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
taPostgres ((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
p ->
            ([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
"postgresql" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
p
        Bool
-> ListBuilder ([String], String, Yaml [String]) ()
-> ListBuilder ([String], String, Yaml [String]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
taGoogleChrome (ListBuilder ([String], String, Yaml [String]) ()
 -> ListBuilder ([String], String, Yaml [String]) ())
-> ListBuilder ([String], String, Yaml [String]) ()
-> ListBuilder ([String], String, Yaml [String]) ()
forall a b. (a -> b) -> a -> b
$
            ([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
"google" String -> Yaml [String] -> ([String], String, Yaml [String])
~> String -> Yaml [String]
forall a. IsString a => String -> a
fromString String
"stable"

-------------------------------------------------------------------------------
-- ToJSON
-------------------------------------------------------------------------------

instance Aeson.ToJSON TravisAddons where
    -- no postgresql on purpose
    toJSON :: TravisAddons -> Value
toJSON TravisAddons {Bool
Maybe String
TravisApt
taApt :: TravisAddons -> TravisApt
taPostgres :: TravisAddons -> Maybe String
taGoogleChrome :: TravisAddons -> Bool
taApt :: TravisApt
taPostgres :: Maybe String
taGoogleChrome :: Bool
..} = [Pair] -> Value
Aeson.object
        [ Key
"apt" Key -> TravisApt -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= TravisApt
taApt
        ]

instance Aeson.ToJSON TravisApt where
    toJSON :: TravisApt -> Value
toJSON TravisApt {[String]
[TravisAptSource]
taPackages :: TravisApt -> [String]
taSources :: TravisApt -> [TravisAptSource]
taPackages :: [String]
taSources :: [TravisAptSource]
..} = [Pair] -> Value
Aeson.object
        [ Key
"packages" Key -> [String] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= [String]
taPackages
        , Key
"sources"  Key -> [TravisAptSource] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= [TravisAptSource]
taSources
        ]

instance Aeson.ToJSON TravisAptSource where
    toJSON :: TravisAptSource -> Value
toJSON (TravisAptSource String
s) = String -> Value
forall a. ToJSON a => a -> Value
Aeson.toJSON String
s
    toJSON (TravisAptSourceLine String
sl Maybe String
Nothing) = [Pair] -> Value
Aeson.object
        [ Key
"sourceline" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= String
sl
        ]
    toJSON (TravisAptSourceLine String
sl (Just String
key_url)) = [Pair] -> Value
Aeson.object
        [ Key
"sourceline" Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= String
sl
        , Key
"key_url"    Key -> String -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
Aeson..= String
key_url
        ]