#[derive(Clone, serde::Serialize, serde::Deserialize)] #[serde(tag = "type")] pub enum Event { Trace { #[serde(with = "level_serde")] level: tracing::Level, message: String, }, Commit { ops: Vec, }, } #[derive(Clone, serde::Serialize, serde::Deserialize)] #[serde(tag = "op", rename_all = "lowercase")] pub enum Op { Upsert { path: String, data: serde_json::Value, }, Delete { path: String, }, } mod level_serde { use serde::{Deserialize, Deserializer, Serializer}; use std::str::FromStr; use tracing::Level; pub fn serialize(level: &Level, serializer: S) -> Result where S: Serializer, { serializer.serialize_str(level.as_str()) } pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let s = String::deserialize(deserializer)?; Level::from_str(&s).map_err(serde::de::Error::custom) } }