diff options
Diffstat (limited to 'src/Config.hs')
-rw-r--r-- | src/Config.hs | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/Config.hs b/src/Config.hs index e9287e4..68db57d 100644 --- a/src/Config.hs +++ b/src/Config.hs @@ -12,6 +12,7 @@ import Control.Monad.Combinators import Control.Monad.IO.Class import Data.ByteString.Lazy qualified as BS +import Data.Either import Data.List import Data.Map qualified as M import Data.Maybe @@ -33,7 +34,7 @@ configFileName = "minici.yaml" data Config = Config - { configJobs :: [ Job ] + { configJobs :: [ DeclaredJob ] , configRepos :: [ DeclaredRepo ] } @@ -67,14 +68,14 @@ instance FromYAML Config where return $ config { configRepos = configRepos config ++ [ repo ] } _ -> return config -parseJob :: Text -> Node Pos -> Parser Job +parseJob :: Text -> Node Pos -> Parser DeclaredJob parseJob name node = flip (withMap "Job") node $ \j -> do let jobName = JobName name - jobCheckout <- choice + ( jobContainingCheckout, jobOtherCheckout ) <- partitionEithers <$> choice [ parseSingleCheckout =<< j .: "checkout" , parseMultipleCheckouts =<< j .: "checkout" , withNull "no checkout" (return []) =<< j .: "checkout" - , return [ ( Nothing, Nothing ) ] + , return [ Left $ JobCheckout Nothing Nothing ] ] jobRecipe <- choice [ cabalJob =<< j .: "cabal" @@ -84,13 +85,17 @@ parseJob name node = flip (withMap "Job") node $ \j -> do jobUses <- maybe (return []) parseUses =<< j .:? "uses" return Job {..} -parseSingleCheckout :: Node Pos -> Parser [ ( Maybe RepoName, Maybe FilePath ) ] +parseSingleCheckout :: Node Pos -> Parser [ Either JobCheckout ( JobRepo Declared, JobCheckout ) ] parseSingleCheckout = withMap "checkout definition" $ \m -> do - name <- m .:? "repo" - subtree <- m .:? "subtree" - return [ ( RepoName <$> name, T.unpack <$> subtree ) ] - -parseMultipleCheckouts :: Node Pos -> Parser [ ( Maybe RepoName, Maybe FilePath ) ] + mbName <- m .:? "repo" + jcSubtree <- fmap T.unpack <$> m .:? "subtree" + jcDestination <- fmap T.unpack <$> m .:? "dest" + let checkout = JobCheckout {..} + return $ (: []) $ case mbName of + Nothing -> Left checkout + Just name -> Right ( DeclaredJobRepo (RepoName name), checkout ) + +parseMultipleCheckouts :: Node Pos -> Parser [ Either JobCheckout ( JobRepo Declared, JobCheckout ) ] parseMultipleCheckouts = withSeq "checkout definitions" $ fmap concat . mapM parseSingleCheckout cabalJob :: Node Pos -> Parser [CreateProcess] @@ -156,7 +161,7 @@ loadConfigForCommit commit = do Just content -> either (\_ -> Left $ "failed to parse " <> configFileName) Right $ parseConfig content Nothing -> Left $ configFileName <> " not found" -loadJobSetForCommit :: MonadIO m => Commit -> m JobSet +loadJobSetForCommit :: MonadIO m => Commit -> m DeclaredJobSet loadJobSetForCommit commit = toJobSet <$> loadConfigForCommit commit where toJobSet configEither = JobSet |