An application which is instantiated and has proper singletons can now be started.
The components which can be “started” need to implement the Start interface and define a start method:
import org.zalando.grafter.{Start, StartResult}
import cats.Eval
case class DoobieDatabase(config: DatabaseConfig) extends Start {
def start: Eval[StartResult] =
StartResult.eval("starting the database") {
println("start the database here")
}
}
Then starting the whole application is just a matter of calling startAll:
import org.zalando.grafter.syntax.rewriter._
val start: Eval[List[StartResult]] =
application.startAll
val results = start.value
if (results.forall(_.success))
println("ok")
else
println("Something went wrong "+results.mkString("\n"))
startAll is going to recursively, bottom up, call all the components with a Start interface and collect the StartResults.
The application can also be stopped in the same manner. stopAll will stop each component implementing Stop from the top down.
startAll and stopAll is that all the components will try to be stopped regardless of failures.
| Total for specification Start the application | |
|---|---|
| Finished in | 14 ms |
| Results | 0 example, 0 failure, 0 error |