16
16
17
17
package org .scalasteward .core .application
18
18
19
+ import better .files .File
19
20
import cats .effect ._
20
21
import cats .effect .implicits ._
22
+ import cats .MonadThrow
21
23
import cats .syntax .all ._
22
24
import eu .timepit .refined .auto ._
23
25
import org .http4s .Uri
@@ -48,6 +50,8 @@ import org.scalasteward.core.vcs.github.{GitHubAppApiAlg, GitHubAuthAlg}
48
50
import org .scalasteward .core .vcs .{VCSApiAlg , VCSExtraAlg , VCSRepoAlg , VCSSelection }
49
51
import org .typelevel .log4cats .Logger
50
52
import org .typelevel .log4cats .slf4j .Slf4jLogger
53
+ import org .scalasteward .core .application .Config .StewardUsage
54
+ import org .scalasteward .core .repoconfig .ValidateRepoConfigAlg
51
55
52
56
final class Context [F [_]](implicit
53
57
val buildToolDispatcher : BuildToolDispatcher [F ],
@@ -77,10 +81,29 @@ final class Context[F[_]](implicit
77
81
)
78
82
79
83
object Context {
80
- def step0 [F [_]](config : Config )(implicit F : Async [F ]): Resource [F , Context [F ]] =
84
+
85
+ sealed trait StewardContext [F [_]] {
86
+ def runF : F [ExitCode ]
87
+ }
88
+ object StewardContext {
89
+ final case class Regular [F [_]](context : Context [F ]) extends StewardContext [F ] {
90
+ override def runF : F [ExitCode ] = context.stewardAlg.runF
91
+ }
92
+
93
+ final case class ValidateRepoConfig [F [_]](file : File )(implicit
94
+ val validateRepoConfigAlg : ValidateRepoConfigAlg [F ],
95
+ val logger : Logger [F ]
96
+ ) extends StewardContext [F ] {
97
+ override def runF : F [ExitCode ] = validateRepoConfigAlg.validateAndReport(file)
98
+ }
99
+ }
100
+
101
+ def step0 [F [_]](
102
+ usage : Config .StewardUsage
103
+ )(implicit F : Async [F ]): Resource [F , StewardContext [F ]] =
81
104
for {
82
- logger <- Resource .eval(Slf4jLogger .fromName[F ](" org.scalasteward.core" ))
83
- _ <- Resource .eval(printBanner(logger ))
105
+ logger0 <- Resource .eval(Slf4jLogger .fromName[F ](" org.scalasteward.core" ))
106
+ _ <- Resource .eval(printBanner(logger0 ))
84
107
_ <- Resource .eval(F .delay(System .setProperty(" http.agent" , userAgentString)))
85
108
userAgent <- Resource .eval(F .fromEither(`User-Agent`.parse(userAgentString)))
86
109
middleware = ClientConfiguration
@@ -94,22 +117,46 @@ object Context {
94
117
ClientConfiguration .disableFollowRedirect[F ],
95
118
middleware
96
119
)
97
- fileAlg = FileAlg .create(logger, F )
98
- processAlg = ProcessAlg .create(config.processCfg)(logger, F )
99
- workspaceAlg = WorkspaceAlg .create(config)(fileAlg, logger, F )
100
- context <- Resource .eval(
101
- step1(config)(
102
- defaultClient,
103
- UrlCheckerClient (urlCheckerClient),
104
- fileAlg,
105
- logger,
106
- processAlg,
107
- workspaceAlg,
108
- F
109
- )
110
- )
120
+ fileAlg0 = FileAlg .create(logger0, F )
121
+ context <- usage match {
122
+ case StewardUsage .Regular (config) =>
123
+ initRegular(config)(
124
+ defaultClient,
125
+ UrlCheckerClient (urlCheckerClient),
126
+ fileAlg0,
127
+ logger0,
128
+ F
129
+ ).map(StewardContext .Regular (_))
130
+
131
+ case StewardUsage .ValidateRepoConfig (file) =>
132
+ implicit val fileAlg : FileAlg [F ] = fileAlg0
133
+ implicit val logger : Logger [F ] = logger0
134
+ Resource .pure[F , StewardContext [F ]](initValidateRepoConfig(file))
135
+ }
136
+
111
137
} yield context
112
138
139
+ def initRegular [F [_]](config : Config )(implicit
140
+ client : Client [F ],
141
+ urlCheckerClient : UrlCheckerClient [F ],
142
+ fileAlg : FileAlg [F ],
143
+ logger : Logger [F ],
144
+ F : Async [F ]
145
+ ): Resource [F , Context [F ]] = {
146
+ implicit val processAlg = ProcessAlg .create(config.processCfg)
147
+ implicit val workspaceAlg = WorkspaceAlg .create(config)
148
+ Resource .eval(step1(config))
149
+ }
150
+
151
+ def initValidateRepoConfig [F [_]](file : File )(implicit
152
+ fileAlg : FileAlg [F ],
153
+ logger : Logger [F ],
154
+ F : MonadThrow [F ]
155
+ ): StewardContext .ValidateRepoConfig [F ] = {
156
+ implicit val validateRepoConfigAlg = new ValidateRepoConfigAlg [F ]()
157
+ StewardContext .ValidateRepoConfig [F ](file)
158
+ }
159
+
113
160
def step1 [F [_]](config : Config )(implicit
114
161
client : Client [F ],
115
162
urlCheckerClient : UrlCheckerClient [F ],
0 commit comments