use std::borrow::Cow;
use crate::env;
use crate::serde::Serialize;
use crate::serde_json;
#[derive(Debug, Serialize)]
#[serde(crate = "crate::serde")]
pub struct Nep297Event<'a, T: Serialize> {
standard: Cow<'a, str>,
version: Cow<'a, str>,
#[serde(skip_serializing)]
event: Cow<'a, str>,
#[serde(flatten)]
data: &'a T,
}
impl<'a, T> Nep297Event<'a, T>
where
T: Serialize,
{
pub fn new<S, V, E>(standard: S, version: V, event: E, data: &'a T) -> Self
where
S: Into<Cow<'a, str>>,
V: Into<Cow<'a, str>>,
E: Into<Cow<'a, str>>,
{
Self { standard: standard.into(), version: version.into(), event: event.into(), data }
}
pub fn standard(&self) -> &str {
&self.standard
}
pub fn version(&self) -> &str {
&self.version
}
pub fn event(&self) -> &str {
&self.event
}
pub fn data(&self) -> Option<serde_json::Value> {
match serde_json::to_value(self).unwrap_or_else(|_| env::abort()) {
serde_json::Value::Object(mut map) => map.remove("data"),
_ => None,
}
}
pub fn to_json(&self) -> serde_json::Value {
serde_json::to_value(self).unwrap_or_else(|_| env::abort())
}
pub fn to_json_string(&self) -> String {
serde_json::to_string(self).unwrap_or_else(|_| env::abort())
}
pub fn to_event_log(&self) -> String {
format!("EVENT_JSON:{}", self.to_json_string())
}
}
pub trait AsNep297Event: Serialize + Sized {
fn to_nep297_event(&self) -> Nep297Event<'_, Self>;
}