WIP: Starting engine development.

This commit is contained in:
Pat Garrity 2024-05-15 22:08:56 -05:00
parent e3c0a4260b
commit 6b3d848bab
Signed by: pfm
GPG key ID: 5CA5D21BAB7F3A76
3 changed files with 67 additions and 3 deletions

View file

@ -47,7 +47,7 @@ lazy val testSettings = Seq(
lazy val `gs-log` = project lazy val `gs-log` = project
.in(file(".")) .in(file("."))
.aggregate(data, api) .aggregate(data, api, engine)
.settings(noPublishSettings) .settings(noPublishSettings)
.settings(name := s"${gsProjectName.value}-v${semVerMajor.value}") .settings(name := s"${gsProjectName.value}-v${semVerMajor.value}")
@ -66,3 +66,14 @@ lazy val api = project
.settings(sharedSettings) .settings(sharedSettings)
.settings(testSettings) .settings(testSettings)
.settings(name := s"${gsProjectName.value}-api-v${semVerMajor.value}") .settings(name := s"${gsProjectName.value}-api-v${semVerMajor.value}")
lazy val engine = project
.in(file("modules/engine"))
.dependsOn(data, api)
.settings(sharedSettings)
.settings(testSettings)
.settings(name := s"${gsProjectName.value}-engine-v${semVerMajor.value}")
.settings(libraryDependencies ++= Seq(
Deps.Cats.Effect,
Deps.Fs2.Core
))

View file

@ -60,7 +60,7 @@ trait Logger[F[_]]:
/** /**
* @return The name of this logger. * @return The name of this logger.
*/ */
def name(): Logger.Name def name: Logger.Name
/** /**
* Determine whether this logger has the given level enabled. * Determine whether this logger has the given level enabled.
@ -68,7 +68,7 @@ trait Logger[F[_]]:
* @param level The [[LogLevel]] to check. * @param level The [[LogLevel]] to check.
* @return True if the level is enabled, false otherwise. * @return True if the level is enabled, false otherwise.
*/ */
def isLevelEnabled(level: LogLevel): Boolean def isLevelEnabled(level: LogLevel): F[Boolean]
object Logger: object Logger:

View file

@ -0,0 +1,53 @@
package gs.log.v0.engine
import gs.log.v0.api.Logger
import cats.effect.Async
import gs.log.v0.data.Log
import gs.log.v0.data.LogLevel
import gs.log.v0.api.Logger.Name
import cats.effect.Ref
import cats.syntax.all.*
import cats.effect.std.Queue
import java.time.Clock
import java.time.Instant
final class QueueLogger[F[_]: Async](
val name: Logger.Name,
private val clock: Clock,
private val maxLevel: Ref[F, LogLevel],
private val queue: Queue[F, (Log, Log.Metadata)]
) extends Logger[F] {
override def isLevelEnabled(level: LogLevel): F[Boolean] =
maxLevel.get.map(max => level <= max)
override def warn(log: => Log): F[Unit] = ???
override def debug(log: => Log): F[Unit] = ???
override def info(log: => Log): F[Unit] = ???
override def error(log: => Log): F[Unit] = ???
override def fatal(log: => Log): F[Unit] = ???
override def trace(log: => Log): F[Unit] =
meta(LogLevel.Trace).flatMap(m => queue.tryOffer((log, m))).flatMap {
case true => Async[F].unit
case false => Async[F].unit
}
private def now(): F[Instant] =
Async[F].delay(Instant.now(clock))
private def meta(level: LogLevel): F[Log.Metadata] =
now().map(timestamp =>
Log.Metadata(
level = level,
timestamp = timestamp,
owner = name.show
)
)
}