@@ -2,22 +2,24 @@ module Setup.BuildPlan (constructBuildPlan, BuildPlan) where
2
2
3
3
import Prelude
4
4
5
- import Actions.Core as Core
5
+ import Control.Monad.Except.Trans ( ExceptT )
6
6
import Data.Argonaut.Core (Json )
7
7
import Data.Argonaut.Decode (decodeJson , printJsonDecodeError , (.:))
8
- import Data.Array as Array
9
- import Data.Bifunctor (bimap , lmap )
8
+ import Data.Bifunctor (lmap )
10
9
import Data.Either (Either (..))
11
10
import Data.Foldable (fold )
12
- import Data.Maybe ( Maybe (..) )
11
+ import Data.Newtype ( unwrap )
13
12
import Data.Traversable (traverse )
14
13
import Data.Version (Version )
15
14
import Data.Version as Version
16
15
import Effect (Effect )
17
16
import Effect.Aff (error , throwError )
17
+ import Effect.Class (liftEffect )
18
+ import Effect.Exception (Error )
19
+ import GitHub.Actions.Core as Core
18
20
import Setup.Data.Key (Key )
19
21
import Setup.Data.Key as Key
20
- import Setup.Data.Tool (Tool , required )
22
+ import Setup.Data.Tool (Tool )
21
23
import Setup.Data.Tool as Tool
22
24
import Text.Parsing.Parser (parseErrorMessage )
23
25
import Text.Parsing.Parser as ParseError
@@ -26,42 +28,34 @@ import Text.Parsing.Parser as ParseError
26
28
type BuildPlan = Array { tool :: Tool , version :: Version }
27
29
28
30
-- | 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
31
33
32
34
-- | The parsed value of an input field that specifies a version
33
35
data VersionField = Latest | Exact Version
34
36
35
37
-- | 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
40
42
" 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)
42
46
43
47
-- | Resolve the exact version to provide for a tool in the environment, based
44
48
-- | 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 }
46
50
resolve versionsContents tool = do
47
51
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
61
55
Core .info " Found exact version"
62
56
pure { tool, version: v }
63
57
64
- Right Latest -> do
58
+ Latest -> liftEffect do
65
59
Core .info $ fold [ " Fetching latest tag for " , Tool .name tool ]
66
60
67
61
let
0 commit comments