use std::fmt::{self, Debug, Display};
use std::str::FromStr;
use serde::{Deserialize, Serialize};
#[allow(unused_imports)]
use crate as surrealdb_types;
use crate::{SurrealValue, Uuid, Value};
#[derive(
Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, SurrealValue,
)]
#[surreal(crate = "crate")]
#[surreal(untagged, uppercase)]
#[serde(rename_all = "UPPERCASE")]
pub enum Action {
Create,
Update,
Delete,
Killed,
}
impl Display for Action {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Action::Create => write!(f, "CREATE"),
Action::Update => write!(f, "UPDATE"),
Action::Delete => write!(f, "DELETE"),
Action::Killed => write!(f, "KILLED"),
}
}
}
impl FromStr for Action {
type Err = crate::Error;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s {
"CREATE" => Ok(Action::Create),
"UPDATE" => Ok(Action::Update),
"DELETE" => Ok(Action::Delete),
"KILLED" => Ok(Action::Killed),
_ => Err(crate::Error::validation(format!("Invalid action: {s}"), None)),
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, SurrealValue)]
#[surreal(crate = "crate")]
#[non_exhaustive]
pub struct Notification {
pub id: Uuid,
pub session: Option<Uuid>,
pub action: Action,
pub record: Value,
pub result: Value,
}
impl Notification {
pub fn new(
id: Uuid,
session: Option<Uuid>,
action: Action,
record: Value,
result: Value,
) -> Self {
Self {
id,
session,
action,
record,
result,
}
}
}