You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.9 KiB

  1. package nova.monadic_sfx.util.reactive
  2. import java.time.LocalDateTime
  3. import io.circe.Encoder
  4. import io.circe.Printer
  5. import io.circe.generic.JsonCodec
  6. import io.circe.syntax._
  7. import io.odin.Logger
  8. import io.odin.LoggerMessage
  9. import io.odin.formatter.options.PositionFormat
  10. import io.odin.formatter.options.ThrowableFormat
  11. import io.odin.meta.Render
  12. import monix.bio.Task
  13. import monix.reactive.Observable
  14. // object Middleware {
  15. // def apply[A,M,T](ob: Observable[(A,M)], cb: (A,M) => T): Observable[(A,M)] = ob
  16. // }
  17. @JsonCodec
  18. final case class StoreInfo[A](
  19. name: String,
  20. action: A,
  21. time: LocalDateTime = LocalDateTime.now()
  22. )
  23. object StoreInfo {
  24. val printer = Printer.noSpaces
  25. implicit def render[T: Encoder]: Render[StoreInfo[T]] =
  26. new Render[StoreInfo[T]] {
  27. override def render(m: StoreInfo[T]): String = printer.print(m.asJson)
  28. }
  29. }
  30. object Middlewares {
  31. // val encoder: Encoder[LoggerMessage] =
  32. // Encoder.forProduct1("message")(m => m.message.value)
  33. val format = create(ThrowableFormat.Default, PositionFormat.Full)
  34. def create(
  35. throwableFormat: ThrowableFormat,
  36. positionFormat: PositionFormat
  37. ): io.odin.formatter.Formatter = {
  38. // val encoder: Encoder[LoggerMessage] =
  39. // Encoder.forProduct1("message")(m => m.message.value)
  40. (msg: LoggerMessage) => msg.message.value
  41. }
  42. def actionStateLoggerMiddleware[A, M](
  43. logger: Logger[Task]
  44. ): Task[Middleware[A, M]] =
  45. Task.deferAction(implicit s =>
  46. Task((obs: Observable[(A, M)]) =>
  47. obs.doOnNextF {
  48. case (a, m) =>
  49. logger.debug(s"Received action $a with state $m")
  50. }
  51. )
  52. )
  53. def actionLoggerMiddleware[A: Encoder, M](
  54. logger: Logger[Task],
  55. name: String
  56. ): Task[Middleware[A, M]] =
  57. Task.deferAction(implicit s =>
  58. Task((obs: Observable[(A, M)]) =>
  59. obs.doOnNextF {
  60. case (a, _) =>
  61. logger.debug(StoreInfo(name, a))
  62. }
  63. )
  64. )
  65. }