@@ -2,22 +2,24 @@ module Setup.BuildPlan (constructBuildPlan, BuildPlan) where
22
33import Prelude
44
5- import Actions.Core as Core
5+ import Control.Monad.Except.Trans ( ExceptT )
66import Data.Argonaut.Core (Json )
77import Data.Argonaut.Decode (decodeJson , printJsonDecodeError , (.:))
8- import Data.Array as Array
9- import Data.Bifunctor (bimap , lmap )
8+ import Data.Bifunctor (lmap )
109import Data.Either (Either (..))
1110import Data.Foldable (fold )
12- import Data.Maybe ( Maybe (..) )
11+ import Data.Newtype ( unwrap )
1312import Data.Traversable (traverse )
1413import Data.Version (Version )
1514import Data.Version as Version
1615import Effect (Effect )
1716import Effect.Aff (error , throwError )
17+ import Effect.Class (liftEffect )
18+ import Effect.Exception (Error )
19+ import GitHub.Actions.Core as Core
1820import Setup.Data.Key (Key )
1921import Setup.Data.Key as Key
20- import Setup.Data.Tool (Tool , required )
22+ import Setup.Data.Tool (Tool )
2123import Setup.Data.Tool as Tool
2224import Text.Parsing.Parser (parseErrorMessage )
2325import Text.Parsing.Parser as ParseError
@@ -26,42 +28,34 @@ import Text.Parsing.Parser as ParseError
2628type BuildPlan = Array { tool :: Tool , version :: Version }
2729
2830-- | Construct the list of tools that sholud be downloaded and cached by the action
29- constructBuildPlan :: Json -> Effect BuildPlan
30- constructBuildPlan json = map Array .catMaybes $ traverse (resolve json) Tool .allTools
31+ constructBuildPlan :: Json -> ExceptT Error Effect BuildPlan
32+ constructBuildPlan json = traverse (resolve json) Tool .allTools
3133
3234-- | The parsed value of an input field that specifies a version
3335data VersionField = Latest | Exact Version
3436
3537-- | Attempt to read the value of an input specifying a tool version
36- getVersionField :: Key -> Effect ( Maybe ( Either String VersionField ))
37- getVersionField = map (map parse) <<< Core .getInput
38- where
39- parse = case _ of
38+ getVersionField :: Key -> ExceptT Error Effect VersionField
39+ getVersionField key = do
40+ value <- Core .getInput' (unwrap key)
41+ case value of
4042 " latest" -> pure Latest
41- value -> bimap ParseError .parseErrorMessage Exact (Version .parseVersion value)
43+ val -> case Version .parseVersion val of
44+ Left msg -> throwError (error (ParseError .parseErrorMessage msg))
45+ Right version -> pure (Exact version)
4246
4347-- | Resolve the exact version to provide for a tool in the environment, based
4448-- | on the action.yml file.
45- resolve :: Json -> Tool -> Effect ( Maybe { tool :: Tool , version :: Version } )
49+ resolve :: Json -> Tool -> ExceptT Error Effect { tool :: Tool , version :: Version }
4650resolve versionsContents tool = do
4751 let key = Key .fromTool tool
48- getVersionField key >>= case _ of
49- Nothing | required tool -> throwError $ error " No input received for required key."
50- Nothing -> pure Nothing
51- Just field -> map Just $ getVersion field
52-
53- where
54- getVersion :: Either String VersionField -> Effect { tool :: Tool , version :: Version }
55- getVersion = case _ of
56- Left err -> do
57- Core .setFailed $ fold [ " Unable to parse version: " , err ]
58- throwError $ error " Unable to complete fetching version."
59-
60- Right (Exact v) -> do
52+ field <- getVersionField key
53+ case field of
54+ Exact v -> liftEffect do
6155 Core .info " Found exact version"
6256 pure { tool, version: v }
6357
64- Right Latest -> do
58+ Latest -> liftEffect do
6559 Core .info $ fold [ " Fetching latest tag for " , Tool .name tool ]
6660
6761 let
0 commit comments