use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
pub enum UpdateType {
SyncCipherUpdate = 1,
SyncCipherCreate = 2,
SyncLoginDelete = 3,
SyncFolderDelete = 4,
SyncCiphers = 5,
SyncVault = 6,
SyncOrgKeys = 7,
SyncFolderCreate = 8,
SyncFolderUpdate = 9,
SyncCipherDelete = 10,
SyncSettings = 11,
SyncLogOut = 12,
SyncSendCreate = 13,
SyncSendUpdate = 14,
SyncSendDelete = 15,
AuthRequest = 16,
AuthRequestResponse = 17,
}
#[derive(Debug, Serialize)]
pub struct Notification {
#[serde(rename = "Type")]
pub update_type: UpdateType,
#[serde(rename = "Payload", skip_serializing_if = "Option::is_none")]
pub payload: Option<serde_json::Value>,
}
impl Notification {
#[must_use]
pub fn new(update_type: UpdateType, payload: Option<serde_json::Value>) -> Self {
Self { update_type, payload }
}
pub fn to_msgpack(&self) -> Result<Vec<u8>, rmp_serde::encode::Error> {
let payload_str = self
.payload
.as_ref()
.and_then(|v| serde_json::to_string(v).ok())
.unwrap_or_default();
rmp_serde::encode::to_vec_named(&(self.update_type as u8, payload_str))
}
}
pub fn serialize_msgpack<T: Serialize>(value: &T) -> Result<Vec<u8>, rmp_serde::encode::Error> {
rmp_serde::encode::to_vec_named(value)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn notification_msgpack_round_trips() {
let n = Notification::new(UpdateType::SyncCipherCreate, Some(serde_json::json!({"id": "abc"})));
let bytes = n.to_msgpack().expect("serialize");
assert!(!bytes.is_empty());
assert!(bytes.len() > 0);
}
#[test]
fn notification_without_payload() {
let n = Notification::new(UpdateType::SyncLogOut, None);
let bytes = n.to_msgpack().expect("serialize");
assert!(!bytes.is_empty());
}
}