Skip to content

Commit

Permalink
Updated ZIO modules to the new simplified version (#193)
Browse files Browse the repository at this point in the history
  • Loading branch information
RCMartins committed Feb 27, 2021
1 parent 391a5c5 commit 9fed615
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 89 deletions.
14 changes: 5 additions & 9 deletions blinky-cli/src/main/scala/blinky/cli/Cli.scala
Expand Up @@ -15,16 +15,13 @@ object Cli extends zio.App {
private type ParserEnvironment = ParserModule with CliModule

override def run(args: List[String]): ZIO[ZEnv, Nothing, ExitCode] =
parseAndRun(args).provide {
new ParserModule.Live with ExternalModule.Live with CliModule.Live {
override val pwdLive: File = File(".")
}
parseAndRun(args).provideLayer {
ParserModule.live ++ CliModule.live(File(".")) ++ ExternalModule.live
}

private def parseAndRun(strArgs: List[String]): URIO[FullEnvironment, ExitCode] =
for {
env <- ZIO.environment[ExternalModule]
external <- env.externalModule.external
external <- ExternalModule.external
parseResult <- parse(strArgs)
instructions <- parseResult match {
case Left(exitCode) =>
Expand All @@ -42,9 +39,8 @@ object Cli extends zio.App {
strArgs: List[String]
): URIO[ParserEnvironment, Either[String, MutationsConfigValidated]] =
for {
env <- ZIO.environment[ParserEnvironment]
parser <- env.parserModule.parser
pwd <- env.cliModule.pwd
parser <- ParserModule.parser
pwd <- CliModule.pwd
args <- ZIO.succeed(OParser.parse(Parser.parser, strArgs, Args(), parser))
} yield args match {
case None =>
Expand Down
5 changes: 2 additions & 3 deletions blinky-cli/src/main/scala/blinky/run/Run.scala
Expand Up @@ -6,7 +6,7 @@ import blinky.run.Instruction._
import blinky.run.config.{MutationsConfigValidated, SimpleBlinkyConfig}
import blinky.run.modules.CliModule
import blinky.v0.BlinkyConfig
import zio.{ExitCode, RIO, ZIO}
import zio.{ExitCode, RIO}

import scala.util.Try

Expand All @@ -16,8 +16,7 @@ object Run {

def run(config: MutationsConfigValidated): RIO[CliModule, Instruction[ExitCode]] =
for {
env <- ZIO.environment[CliModule]
pwd <- env.cliModule.pwd
pwd <- CliModule.pwd

originalProjectRoot: Path = Path(pwd.path.toAbsolutePath)
originalProjectRelPath: RelPath =
Expand Down
25 changes: 8 additions & 17 deletions blinky-cli/src/main/scala/blinky/run/modules/CliModule.scala
@@ -1,30 +1,21 @@
package blinky.run.modules

import better.files.File
import zio.ZIO

trait CliModule {
def cliModule: CliModule.Service[Any]
}
import zio.{Layer, ZIO, ZLayer}

object CliModule {

trait Service[R] {
def pwd: ZIO[R, Nothing, File]
trait Service {
def pwd: ZIO[Any, Nothing, File]
}

trait Live extends CliModule {
val pwdLive: File
def pwd: ZIO[CliModule, Nothing, File] =
ZIO.accessM[CliModule](_.get.pwd)

override val cliModule: Service[Any] = new Service[Any] {
def live(pwdLive: File): Layer[Nothing, CliModule] =
ZLayer.succeed(new Service {
override def pwd: ZIO[Any, Nothing, File] =
ZIO.succeed(pwdLive)
}
}

object factory extends CliModule.Service[CliModule] {
override def pwd: ZIO[CliModule, Nothing, File] =
ZIO.accessM[CliModule](_.cliModule.pwd)
}
})

}
28 changes: 10 additions & 18 deletions blinky-cli/src/main/scala/blinky/run/modules/ExternalModule.scala
@@ -1,29 +1,21 @@
package blinky.run.modules

import blinky.run.external.{AmmoniteExternalCalls, ExternalCalls}
import zio.ZIO

trait ExternalModule {
def externalModule: ExternalModule.Service[Any]
}
import zio.{Layer, ZIO, ZLayer}

object ExternalModule {

trait Service[R] {
def external: ZIO[R, Nothing, ExternalCalls]
trait Service {
def external: ZIO[Any, Nothing, ExternalCalls]
}

trait Live extends ExternalModule {
override def externalModule: Service[Any] =
new Service[Any] {
override def external: ZIO[Any, Nothing, ExternalCalls] =
ZIO.succeed(AmmoniteExternalCalls)
}
}
def external: ZIO[ExternalModule, Nothing, ExternalCalls] =
ZIO.accessM[ExternalModule](_.get.external)

object factory extends ExternalModule.Service[ExternalModule] {
override def external: ZIO[ExternalModule, Nothing, ExternalCalls] =
ZIO.accessM[ExternalModule](_.externalModule.external)
}
val live: Layer[Nothing, ExternalModule] =
ZLayer.succeed(new Service {
override def external: ZIO[Any, Nothing, ExternalCalls] =
ZIO.succeed(AmmoniteExternalCalls)
})

}
28 changes: 10 additions & 18 deletions blinky-cli/src/main/scala/blinky/run/modules/ParserModule.scala
@@ -1,29 +1,21 @@
package blinky.run.modules

import scopt.{DefaultOParserSetup, OParserSetup}
import zio.ZIO

trait ParserModule {
def parserModule: ParserModule.Service[Any]
}
import zio.{Layer, ZIO, ZLayer}

object ParserModule {

trait Service[R] {
def parser: ZIO[R, Nothing, OParserSetup]
trait Service {
def parser: ZIO[Any, Nothing, OParserSetup]
}

trait Live extends ParserModule {
override def parserModule: Service[Any] =
new Service[Any] {
override def parser: ZIO[Any, Nothing, OParserSetup] =
ZIO.succeed(new DefaultOParserSetup() {})
}
}
def parser: ZIO[ParserModule, Nothing, OParserSetup] =
ZIO.accessM[ParserModule](_.get.parser)

object factory extends ParserModule.Service[ParserModule] {
override def parser: ZIO[ParserModule, Nothing, OParserSetup] =
ZIO.accessM[ParserModule](_.parserModule.parser)
}
val live: Layer[Nothing, ParserModule] =
ZLayer.succeed(new Service {
override def parser: ZIO[Any, Nothing, OParserSetup] =
ZIO.succeed(new DefaultOParserSetup() {})
})

}
13 changes: 13 additions & 0 deletions blinky-cli/src/main/scala/blinky/run/modules/package.scala
@@ -0,0 +1,13 @@
package blinky.run

import zio.Has

package object modules {

type ParserModule = Has[ParserModule.Service]

type CliModule = Has[CliModule.Service]

type ExternalModule = Has[ExternalModule.Service]

}
19 changes: 8 additions & 11 deletions blinky-cli/src/test/scala/blinky/cli/CliTest.scala
@@ -1,21 +1,19 @@
package blinky.cli

import java.io.ByteArrayOutputStream
import java.util.concurrent.TimeUnit

import better.files.File
import blinky.BuildInfo.version
import blinky.TestSpec
import blinky.run.config.{MutationsConfigValidated, OptionsConfig, SimpleBlinkyConfig}
import blinky.run.modules.TestModules.{TestCliModule, TestParserModule}
import blinky.run.modules.{CliModule, ParserModule}
import blinky.run.modules.{CliModule, ParserModule, TestModules}
import blinky.v0.Mutators
import scopt.DefaultOParserSetup
import zio.UIO
import zio.test.Assertion._
import zio.test._
import zio.test.environment._
import zio.{Layer, UIO}

import java.io.ByteArrayOutputStream
import java.util.concurrent.TimeUnit
import scala.concurrent.duration._

object CliTest extends TestSpec {
Expand Down Expand Up @@ -331,12 +329,11 @@ object CliTest extends TestSpec {
): (UIO[Either[String, MutationsConfigValidated]], MyParser) = {
val myParser = new MyParser()

val parserEnv: ParserModule with CliModule = new ParserModule with CliModule {
override val parserModule: ParserModule.Service[Any] = new TestParserModule(myParser._parser)
override val cliModule: CliModule.Service[Any] = new TestCliModule(pwd)
}
val parserEnv: Layer[Nothing, ParserModule with CliModule] =
TestModules.testParserModule(myParser._parser) ++
TestModules.testCliModule(pwd)

(Cli.parse(args.toList).provide(parserEnv), myParser)
(Cli.parse(args.toList).provideLayer(parserEnv), myParser)
}

}
29 changes: 16 additions & 13 deletions blinky-cli/src/test/scala/blinky/run/modules/TestModules.scala
Expand Up @@ -3,23 +3,26 @@ package blinky.run.modules
import better.files.File
import blinky.run.external.ExternalCalls
import scopt.OParserSetup
import zio.ZIO
import zio.{Layer, ZIO, ZLayer}

object TestModules {

class TestParserModule(oParserSetup: OParserSetup) extends ParserModule.Service[Any] {
override def parser: ZIO[Any, Nothing, OParserSetup] =
ZIO.succeed(oParserSetup)
}
def testParserModule(oParserSetup: OParserSetup): Layer[Nothing, ParserModule] =
ZLayer.succeed(new ParserModule.Service {
override def parser: ZIO[Any, Nothing, OParserSetup] =
ZIO.succeed(oParserSetup)
})

class TestExternalModule(externalCalls: ExternalCalls) extends ExternalModule.Service[Any] {
override def external: ZIO[Any, Nothing, ExternalCalls] =
ZIO.succeed(externalCalls)
}
def testCliModule(pwdLive: File): Layer[Nothing, CliModule] =
ZLayer.succeed(new CliModule.Service {
override def pwd: ZIO[Any, Nothing, File] =
ZIO.succeed(pwdLive)
})

class TestCliModule(pwdFile: File) extends CliModule.Service[Any] {
override def pwd: ZIO[Any, Nothing, File] =
ZIO.succeed(pwdFile)
}
def testExternalModule(externalCalls: ExternalCalls): Layer[Nothing, ExternalModule] =
ZLayer.succeed(new ExternalModule.Service {
override def external: ZIO[Any, Nothing, ExternalCalls] =
ZIO.succeed(externalCalls)
})

}

0 comments on commit 9fed615

Please sign in to comment.