diff --git a/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala new file mode 100644 index 0000000..a7ca074 --- /dev/null +++ b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala @@ -0,0 +1,27 @@ +package works.iterative.akka + +import akka.util.Timeout +import zio.* +import zio.config.* +import scala.concurrent.duration.* + +case class AkkaConfig(timeout: Timeout = Timeout(10.seconds)) + +object AkkaConfig: + val configDescriptor: ConfigDescriptor[AkkaConfig] = + import ConfigDescriptor.* + nested("AKKA") { + duration("TIMEOUT") + .default(10.seconds) + .transformOrFail( + d => + d match + case d: FiniteDuration => Right(Timeout(d)) + case _ => Left("timeout must be finite") + , + t => Right(t.duration) + ) + }.to[AkkaConfig] + + val fromEnv: ZLayer[Any, ReadError[String], AkkaConfig] = + ZConfig.fromSystemEnv(configDescriptor, Some('_'), Some(',')) diff --git a/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala new file mode 100644 index 0000000..a7ca074 --- /dev/null +++ b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala @@ -0,0 +1,27 @@ +package works.iterative.akka + +import akka.util.Timeout +import zio.* +import zio.config.* +import scala.concurrent.duration.* + +case class AkkaConfig(timeout: Timeout = Timeout(10.seconds)) + +object AkkaConfig: + val configDescriptor: ConfigDescriptor[AkkaConfig] = + import ConfigDescriptor.* + nested("AKKA") { + duration("TIMEOUT") + .default(10.seconds) + .transformOrFail( + d => + d match + case d: FiniteDuration => Right(Timeout(d)) + case _ => Left("timeout must be finite") + , + t => Right(t.duration) + ) + }.to[AkkaConfig] + + val fromEnv: ZLayer[Any, ReadError[String], AkkaConfig] = + ZConfig.fromSystemEnv(configDescriptor, Some('_'), Some(',')) diff --git a/build.sbt b/build.sbt index 98ec92b..2e1fdd8 100644 --- a/build.sbt +++ b/build.sbt @@ -83,7 +83,8 @@ libraryDependencies += IWDeps.akka.modules.persistence .cross(CrossVersion.for3Use2_13), libraryDependencies += "com.typesafe.akka" %% "akka-cluster-sharding-typed" % IWDeps.akka.V cross (CrossVersion.for3Use2_13), - IWDeps.akka.profiles.eventsourcedJdbcProjection + IWDeps.akka.profiles.eventsourcedJdbcProjection, + libraryDependencies += "com.github.ghik" %% "silencer-lib" % "1.4.2" % Provided cross CrossVersion.for3Use2_13 ) lazy val ui = crossProject(JSPlatform, JVMPlatform) diff --git a/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala new file mode 100644 index 0000000..a7ca074 --- /dev/null +++ b/akka-persistence/src/main/scala/iw/akka/AkkaConfig.scala @@ -0,0 +1,27 @@ +package works.iterative.akka + +import akka.util.Timeout +import zio.* +import zio.config.* +import scala.concurrent.duration.* + +case class AkkaConfig(timeout: Timeout = Timeout(10.seconds)) + +object AkkaConfig: + val configDescriptor: ConfigDescriptor[AkkaConfig] = + import ConfigDescriptor.* + nested("AKKA") { + duration("TIMEOUT") + .default(10.seconds) + .transformOrFail( + d => + d match + case d: FiniteDuration => Right(Timeout(d)) + case _ => Left("timeout must be finite") + , + t => Right(t.duration) + ) + }.to[AkkaConfig] + + val fromEnv: ZLayer[Any, ReadError[String], AkkaConfig] = + ZConfig.fromSystemEnv(configDescriptor, Some('_'), Some(',')) diff --git a/build.sbt b/build.sbt index 98ec92b..2e1fdd8 100644 --- a/build.sbt +++ b/build.sbt @@ -83,7 +83,8 @@ libraryDependencies += IWDeps.akka.modules.persistence .cross(CrossVersion.for3Use2_13), libraryDependencies += "com.typesafe.akka" %% "akka-cluster-sharding-typed" % IWDeps.akka.V cross (CrossVersion.for3Use2_13), - IWDeps.akka.profiles.eventsourcedJdbcProjection + IWDeps.akka.profiles.eventsourcedJdbcProjection, + libraryDependencies += "com.github.ghik" %% "silencer-lib" % "1.4.2" % Provided cross CrossVersion.for3Use2_13 ) lazy val ui = crossProject(JSPlatform, JVMPlatform) diff --git a/ui/js/src/main/scala/works/iterative/ui/components/laminar/HtmlRenderable.scala b/ui/js/src/main/scala/works/iterative/ui/components/laminar/HtmlRenderable.scala index 64b2333..b5edf84 100644 --- a/ui/js/src/main/scala/works/iterative/ui/components/laminar/HtmlRenderable.scala +++ b/ui/js/src/main/scala/works/iterative/ui/components/laminar/HtmlRenderable.scala @@ -2,7 +2,7 @@ import com.raquo.laminar.api.L.* import java.time.LocalDate -import works.iterative.core.PlainMultiLine +import works.iterative.core.* import java.time.Instant import works.iterative.ui.TimeUtils import works.iterative.core.UserMessage @@ -35,6 +35,10 @@ TimeUtils.formatDateTime(v) ) + given plainOneLineValue: HtmlRenderable[PlainOneLine] with + def toHtml(v: PlainOneLine): Modifier[HtmlElement] = + span(v.toString) + given plainMultiLineValue: HtmlRenderable[PlainMultiLine] with def toHtml(v: PlainMultiLine): Modifier[HtmlElement] = p(cls("whitespace-pre-wrap"), v.toString)