-
Notifications
You must be signed in to change notification settings - Fork 1
/
Event.scala
72 lines (63 loc) · 2.24 KB
/
Event.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package tech.unisonui.models
import io.circe.syntax._
import io.circe.{Encoder, Json}
sealed trait Event extends Product with Serializable {
val id: String
}
object Event {
sealed trait Service extends Product with Serializable {
val id: String
}
object Service {
final case class OpenApi(id: String,
name: String,
useProxy: Boolean,
metadata: Map[String, String] = Map.empty)
extends Service
final case class Grpc(id: String,
name: String,
metadata: Map[String, String] = Map.empty)
extends Service
implicit val encoder: Encoder[Service] = Encoder.instance {
case OpenApi(id, name, useProxy, metadata) =>
Json.obj(
"event" -> Json.fromString("serviceUp"),
"id" -> Json.fromString(id),
"name" -> Json.fromString(name),
"metadata" -> Json.obj(
metadata.view.mapValues(Json.fromString).toSeq: _*),
"useProxy" -> Json.fromBoolean(useProxy),
"type" -> Json.fromString("openapi")
)
case Grpc(id, name, metadata) =>
Json.obj(
"event" -> Json.fromString("serviceUp"),
"id" -> Json.fromString(id),
"name" -> Json.fromString(name),
"metadata" -> Json.obj(
metadata.view.mapValues(Json.fromString).toSeq: _*),
"type" -> Json.fromString("grpc")
)
}
}
final case class ServiceUp(service: Service) extends Event {
override val id: String = service.id
}
final case class ServiceDown(id: String) extends Event
final case class ServiceContentChanged(id: String) extends Event
implicit val encoder: Encoder[Event] = {
case ServiceUp(service: Service) => service.asJson
case ServiceDown(id) =>
Json.obj(
"event" -> Json.fromString("serviceDown"),
"id" -> Json.fromString(id)
)
case ServiceContentChanged(id) =>
Json.obj(
"event" -> Json.fromString("serviceChanged"),
"id" -> Json.fromString(id)
)
}
implicit val listEncoder: Encoder[List[ServiceUp]] =
(events: List[ServiceUp]) => Json.arr(events.map(encoder(_)): _*)
}