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.

64 lines
1.6 KiB

3 years ago
3 years ago
3 years ago
3 years ago
  1. package outwatchapp.util.reactive.store
  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. @JsonCodec
  15. final case class StoreInfo[A](
  16. name: String,
  17. action: A,
  18. time: LocalDateTime
  19. )
  20. object StoreInfo {
  21. val printer = Printer.noSpaces
  22. implicit def render[T: Encoder]: Render[StoreInfo[T]] =
  23. new Render[StoreInfo[T]] {
  24. override def render(m: StoreInfo[T]): String = printer.print(m.asJson)
  25. }
  26. }
  27. object Middlewares {
  28. val format = create(ThrowableFormat.Default, PositionFormat.Full)
  29. def create(
  30. throwableFormat: ThrowableFormat,
  31. positionFormat: PositionFormat
  32. ): io.odin.formatter.Formatter = (msg: LoggerMessage) => msg.message.value
  33. def actionStateLoggerMiddleware[A, M](
  34. logger: Logger[Task]
  35. ): Task[Middleware[A, M]] =
  36. Task.deferAction(implicit s =>
  37. Task((obs: Observable[(A, M)]) =>
  38. obs.doOnNextF { case (a, m) =>
  39. logger.debug(s"Received action $a with state $m")
  40. }
  41. )
  42. )
  43. def actionLoggerMiddleware[A: Encoder, M](
  44. logger: Logger[Task],
  45. name: String
  46. ): Task[Middleware[A, M]] =
  47. Task.deferAction(implicit s =>
  48. Task((obs: Observable[(A, M)]) =>
  49. obs.doOnNextF { case (a, _) =>
  50. Task(LocalDateTime.now())
  51. .flatMap(curTime => logger.debug(StoreInfo(name, a, curTime)))
  52. }
  53. )
  54. )
  55. }