use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::fmt::Display;
pub mod key_seq_pair;
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Default, Deserialize, Hash)]
pub struct Key(String);
impl Key {
pub fn new(s: String) -> Self {
Key(s)
}
pub fn len(&self) -> usize {
self.0.len()
}
}
impl From<&str> for Key {
fn from(s: &str) -> Self {
Key(s.to_string())
}
}
impl Display for Key {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default, PartialOrd, Ord, Hash,
)]
pub struct SequenceNumber(pub u64);
impl SequenceNumber {
pub fn next(&self) -> Self {
SequenceNumber(self.0 + 1)
}
}
impl Display for SequenceNumber {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Action {
Relay,
Append,
Replace,
Compact { seq: SequenceNumber },
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MessageToDatabase {
Push {
key: Key,
value: Value,
action: Action,
},
Get {
key: Key,
#[serde(default)]
seq: SequenceNumber,
},
Ping {
nonce: Option<u64>,
},
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
pub struct SequenceValue {
pub value: Value,
pub seq: SequenceNumber,
}
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum MessageFromDatabase {
Push {
key: Key,
value: Value,
seq: SequenceNumber,
},
Init {
key: Key,
data: Vec<SequenceValue>,
},
Error {
message: String,
},
StreamSize {
key: Key,
size: usize,
},
Pong {
nonce: Option<u64>,
},
}