diff options
author | Jakob Odersky <jakob@driver.xyz> | 2018-09-12 16:18:26 -0700 |
---|---|---|
committer | Jakob Odersky <jakob@odersky.com> | 2018-10-09 16:19:39 -0700 |
commit | 7c755c77afbd67ae2ded9d8b004736d4e27e208f (patch) | |
tree | e93f4590165a338ed284adeb6f4a6bd43bb16b6a /core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala | |
parent | 76db2360364a35be31414a12cbc419a534a51744 (diff) | |
download | driver-core-7c755c77afbd67ae2ded9d8b004736d4e27e208f.tar.gz driver-core-7c755c77afbd67ae2ded9d8b004736d4e27e208f.tar.bz2 driver-core-7c755c77afbd67ae2ded9d8b004736d4e27e208f.zip |
Move storage and messaging to separate projects
Diffstat (limited to 'core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala')
-rw-r--r-- | core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala b/core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala new file mode 100644 index 0000000..32fd764 --- /dev/null +++ b/core-messaging/src/main/scala/xyz/driver/core/messaging/Topic.scala @@ -0,0 +1,43 @@ +package xyz.driver.core +package messaging + +import java.nio.ByteBuffer + +/** A topic is a named group of messages that all share a common schema. + * @tparam Message type of messages sent over this topic */ +trait Topic[Message] { + + /** Name of this topic (must be unique). */ + def name: String + + /** Convert a message to its wire format that will be sent over a bus. */ + def serialize(message: Message): ByteBuffer + + /** Convert a message from its wire format. */ + def deserialize(message: ByteBuffer): Message + +} + +object Topic { + + /** Create a new "raw" topic without a schema, providing access to the underlying bytes of messages. */ + def raw(name0: String): Topic[ByteBuffer] = new Topic[ByteBuffer] { + def name = name0 + override def serialize(message: ByteBuffer): ByteBuffer = message + override def deserialize(message: ByteBuffer): ByteBuffer = message + } + + /** Create a topic that represents data as UTF-8 encoded strings. */ + def string(name0: String): Topic[String] = new Topic[String] { + def name = name0 + override def serialize(message: String): ByteBuffer = { + ByteBuffer.wrap(message.getBytes("utf-8")) + } + override def deserialize(message: ByteBuffer): String = { + val bytes = new Array[Byte](message.remaining()) + message.get(bytes) + new String(bytes, "utf-8") + } + } + +} |