use core::fmt;
use crate::update::Update;
use super::{Assign, IfNotExists, ListAppend, Math};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SetAction {
Assign(Assign),
Math(Math),
ListAppend(ListAppend),
IfNotExists(IfNotExists),
}
impl SetAction {
pub fn and<T>(self, other: T) -> Update
where
T: Into<Update>,
{
Update::from(self).and(other)
}
}
impl From<Assign> for SetAction {
fn from(assign: Assign) -> Self {
Self::Assign(assign)
}
}
impl From<Math> for SetAction {
fn from(math: Math) -> Self {
Self::Math(math)
}
}
impl From<ListAppend> for SetAction {
fn from(append: ListAppend) -> Self {
Self::ListAppend(append)
}
}
impl From<IfNotExists> for SetAction {
fn from(if_not_exists: IfNotExists) -> Self {
Self::IfNotExists(if_not_exists)
}
}
impl fmt::Display for SetAction {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SetAction::Assign(action) => action.fmt(f),
SetAction::Math(action) => action.fmt(f),
SetAction::ListAppend(action) => action.fmt(f),
SetAction::IfNotExists(action) => action.fmt(f),
}
}
}
#[cfg(test)]
mod test {
use std::error::Error;
use pretty_assertions::assert_eq;
use crate::{
update::{Assign, IfNotExists, ListAppend, Math, Set},
Num, Path,
};
use super::SetAction;
#[test]
fn from() -> Result<(), Box<dyn Error>> {
let assign: Assign = "foo".parse::<Path>()?.set(Num::new(8));
let if_not_exists: IfNotExists = "bar".parse::<Path>()?.if_not_exists().set(Num::new(7));
let math: Math = "baz".parse::<Path>()?.math().add(1);
let list_append: ListAppend = "quux".parse::<Path>()?.list_append().list(["d", "e", "f"]);
let _set_actions = [
SetAction::from(assign),
SetAction::from(if_not_exists),
SetAction::from(math),
SetAction::from(list_append),
];
Ok(())
}
#[test]
fn and() -> Result<(), Box<dyn Error>> {
let assign: Assign = "bar".parse::<Path>()?.set(Num::new(8));
let set_action: SetAction = "foo".parse::<Path>()?.set("a value").into();
let combined = set_action.clone().and(assign.clone());
assert_eq!(r#"SET foo = "a value", bar = 8"#, combined.to_string());
let combined = set_action.clone().and(SetAction::from(assign.clone()));
assert_eq!(r#"SET foo = "a value", bar = 8"#, combined.to_string());
let set: Set = [
SetAction::from(assign),
SetAction::from("baz".parse::<Path>()?.if_not_exists().set(Num::new(7))),
]
.into_iter()
.collect();
let combined = set_action.clone().and(set);
assert_eq!(
r#"SET foo = "a value", bar = 8, baz = if_not_exists(baz, 7)"#,
combined.to_string()
);
let combined = set_action.clone().and("quux".parse::<Path>()?.remove());
assert_eq!(r#"SET foo = "a value" REMOVE quux"#, combined.to_string());
let combined = set_action.and("quux".parse::<Path>()?.remove());
assert_eq!(r#"SET foo = "a value" REMOVE quux"#, combined.to_string());
Ok(())
}
}