mod assign;
pub mod if_not_exists;
pub mod list_append;
pub mod math;
mod set_action;
pub use self::assign::Assign;
pub use self::if_not_exists::IfNotExists;
pub use self::list_append::ListAppend;
pub use self::math::Math;
pub use self::set_action::SetAction;
use core::fmt;
use super::Update;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Set {
pub(crate) actions: Vec<SetAction>,
}
impl Set {
pub fn and<T>(self, other: T) -> Update
where
T: Into<Update>,
{
Update::from(self).and(other)
}
}
impl fmt::Display for Set {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("SET ")?;
let mut first = true;
self.actions.iter().try_for_each(|action| {
if first {
first = false
} else {
f.write_str(", ")?;
}
action.fmt(f)
})
}
}
impl<T> From<T> for Set
where
T: Into<SetAction>,
{
fn from(value: T) -> Self {
Self {
actions: vec![value.into()],
}
}
}
impl<T> FromIterator<T> for Set
where
T: Into<SetAction>,
{
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = T>,
{
Self {
actions: iter.into_iter().map(Into::into).collect(),
}
}
}
#[cfg(test)]
mod test {
use pretty_assertions::assert_eq;
use crate::{Num, Path};
use super::{Assign, IfNotExists, ListAppend, Math, Set, SetAction};
#[test]
fn from() -> Result<(), Box<dyn std::error::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 = [
Set::from(assign.clone()),
Set::from(if_not_exists),
Set::from(math),
Set::from(list_append),
];
let _set = Set::from(SetAction::from(assign));
Ok(())
}
#[test]
fn and() -> Result<(), Box<dyn std::error::Error>> {
let assign: Assign = "bar".parse::<Path>()?.set(Num::new(8));
let set: Set = Set::from("foo".parse::<Path>()?.set("a value"));
let combined = set.clone().and(assign.clone());
assert_eq!(r#"SET foo = "a value", bar = 8"#, combined.to_string());
let combined = set.clone().and(SetAction::from(assign.clone()));
assert_eq!(r#"SET foo = "a value", bar = 8"#, combined.to_string());
let set_2: Set = [
SetAction::from(assign),
SetAction::from("baz".parse::<Path>()?.if_not_exists().set(Num::new(7))),
]
.into_iter()
.collect();
let combined = set.clone().and(set_2);
assert_eq!(
r#"SET foo = "a value", bar = 8, baz = if_not_exists(baz, 7)"#,
combined.to_string()
);
let combined = set.clone().and("quux".parse::<Path>()?.remove());
assert_eq!(r#"SET foo = "a value" REMOVE quux"#, combined.to_string());
let combined = set.and("quux".parse::<Path>()?.remove());
assert_eq!(r#"SET foo = "a value" REMOVE quux"#, combined.to_string());
Ok(())
}
}