Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

zio-json support #47

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,6 @@ jobs:

- name: Run sprayJson-tests
run: sbt ++${{ matrix.scala }} sprayJson/test

- name: Run zio-json-tests
run: sbt ++${{ matrix.scala }} zioJson/test
47 changes: 44 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
lazy val refinedVersion = "0.9.23"
lazy val sttpClientVersion = "3.2.3"
lazy val kindProjectorVersion = "0.11.3"
lazy val circeVersion = "0.13.0"
lazy val json4sVersion = "3.6.11"
lazy val paradiseVersion = "2.1.1"
lazy val enumeratumVersion = "1.6.1"
lazy val slf4jApiVersion = "1.7.30"

Expand All @@ -15,7 +15,14 @@ val scala2_13 = "2.13.5"

val compileAndTest = "compile->compile;test->test"

def priorTo2_13(scalaVersion: String): Boolean =
CrossVersion.partialVersion(scalaVersion) match {
case Some((2, minor)) if minor < 13 => true
case _ => false
}

lazy val buildSettings = Seq(
sonatypeProfileName := "com.nryanov",
organization := "com.nryanov.consul4s",
homepage := Some(url("https://github.com/nryanov/consul4s")),
licenses := List("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0")),
Expand Down Expand Up @@ -76,7 +83,29 @@ lazy val commonSettings = Seq(
Test / parallelExecution := false
)

lazy val allSettings = commonSettings ++ buildSettings
lazy val macroSettings = Seq(
libraryDependencies ++= Seq(
scalaOrganization.value % "scala-compiler" % scalaVersion.value % Provided,
scalaOrganization.value % "scala-reflect" % scalaVersion.value % Provided
) ++ (
if (priorTo2_13(scalaVersion.value)) {
Seq(
compilerPlugin(
("org.scalamacros" % "paradise" % paradiseVersion).cross(CrossVersion.full)
)
)
} else Nil
),
scalacOptions ++= {
if (priorTo2_13(scalaVersion.value)) {
Nil
} else {
Seq("-Ymacro-annotations")
}
}
)

lazy val allSettings = commonSettings ++ buildSettings ++ macroSettings

lazy val consul4s = project
.in(file("."))
Expand All @@ -87,7 +116,8 @@ lazy val consul4s = project
core,
circe,
json4s,
sprayJson
sprayJson,
zioJson
)

lazy val core = project
Expand Down Expand Up @@ -139,6 +169,17 @@ lazy val sprayJson = project
)
.dependsOn(core % compileAndTest)

lazy val zioJson = project
.in(file("modules/zio-json"))
.settings(moduleName := "consul4s-zio-json")
.settings(allSettings)
.settings(
libraryDependencies ++= Seq(
"com.softwaremill.sttp.client3" %% "zio-json" % sttpClientVersion
)
)
.dependsOn(core % compileAndTest)

lazy val examples = project
.in(file("examples"))
.settings(moduleName := "examples")
Expand Down
279 changes: 279 additions & 0 deletions modules/zio-json/src/main/scala/consul4s/ziojson/model/CheckRepr.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
package consul4s.ziojson.model

import consul4s.model.CheckStatus
import consul4s.model.agent._
import zio.json.jsonDiscriminator

// Custom model representation because of object discriminator @jsonDiscriminator("")
@jsonDiscriminator("") sealed trait CheckRepr

object CheckRepr {
def toCheck(inst: CheckRepr): Check = inst match {
case v: ScriptCheckRepr =>
ScriptCheck(
v.Name,
v.Args,
v.Timeout,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.DeregisterCriticalServiceAfter
)
case v: HttpCheckRepr =>
HttpCheck(
v.Name,
v.HTTP,
v.TLSSkipVerify,
v.Interval,
v.Timeout,
v.Header,
v.Method,
v.Body,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: TCPCheckRepr =>
TCPCheck(
v.Name,
v.TCP,
v.Interval,
v.Timeout,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: TTLCheckRepr =>
TTLCheck(
v.Name,
v.TTL,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.DeregisterCriticalServiceAfter
)
case v: DockerCheckRepr =>
DockerCheck(
v.Name,
v.DockerContainerID,
v.Shell,
v.Args,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: GRpcCheckRepr =>
GRpcCheck(
v.Name,
v.GRPC,
v.GRPCUseTLS,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: AliasCheckRepr =>
AliasCheck(
v.ID,
v.AliasNode,
v.AliasService
)
}

def fromCheck(inst: Check): CheckRepr = inst match {
case v: ScriptCheck =>
ScriptCheckRepr(
v.Name,
v.Args,
v.Timeout,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.DeregisterCriticalServiceAfter
)
case v: HttpCheck =>
HttpCheckRepr(
v.Name,
v.HTTP,
v.TLSSkipVerify,
v.Interval,
v.Timeout,
v.Header,
v.Method,
v.Body,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: TCPCheck =>
TCPCheckRepr(
v.Name,
v.TCP,
v.Interval,
v.Timeout,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: TTLCheck =>
TTLCheckRepr(
v.Name,
v.TTL,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.DeregisterCriticalServiceAfter
)
case v: DockerCheck =>
DockerCheckRepr(
v.Name,
v.DockerContainerID,
v.Shell,
v.Args,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: GRpcCheck =>
GRpcCheckRepr(
v.Name,
v.GRPC,
v.GRPCUseTLS,
v.Interval,
v.ID,
v.ServiceID,
v.Status,
v.Notes,
v.SuccessBeforePassing,
v.FailuresBeforeCritical,
v.DeregisterCriticalServiceAfter
)
case v: AliasCheck =>
AliasCheckRepr(
v.ID,
v.AliasNode,
v.AliasService
)
}
}

final case class ScriptCheckRepr(
Name: String,
Args: List[String],
Timeout: Option[String] = None,
Interval: Option[String] = None,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class HttpCheckRepr(
Name: String,
HTTP: String,
TLSSkipVerify: Boolean,
Interval: String,
Timeout: String,
Header: Option[Map[String, List[String]]] = None,
Method: Option[String] = None,
Body: Option[String] = None,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
SuccessBeforePassing: Int = 0,
FailuresBeforeCritical: Int = 0,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class TCPCheckRepr(
Name: String,
TCP: String,
Interval: String,
Timeout: String,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
SuccessBeforePassing: Int = 0,
FailuresBeforeCritical: Int = 0,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class TTLCheckRepr(
Name: String,
TTL: String,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class DockerCheckRepr(
Name: String,
DockerContainerID: String,
Shell: String,
Args: List[String],
Interval: Option[String] = None,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
SuccessBeforePassing: Int = 0,
FailuresBeforeCritical: Int = 0,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class GRpcCheckRepr(
Name: String,
GRPC: String,
GRPCUseTLS: Boolean,
Interval: Option[String] = None,
ID: Option[String] = None,
ServiceID: Option[String] = None,
Status: CheckStatus = CheckStatus.Critical,
Notes: Option[String] = None,
SuccessBeforePassing: Int = 0,
FailuresBeforeCritical: Int = 0,
DeregisterCriticalServiceAfter: Option[String] = None
) extends CheckRepr

final case class AliasCheckRepr(ID: String, AliasNode: Option[String] = None, AliasService: Option[String] = None) extends CheckRepr
Loading