pub mod auth;
pub mod capabilities;
mod config;
pub(crate) mod endpoint;
mod export;
pub(crate) mod query;
mod resource;
mod tls;
mod websocket;
pub use config::*;
pub use endpoint::*;
pub use export::*;
pub use query::*;
pub use resource::*;
#[cfg(any(feature = "native-tls", feature = "rustls"))]
pub use tls::*;
pub use websocket::*;
use crate::types::{SurrealValue, Value};
#[derive(Debug, SurrealValue)]
#[surreal(crate = "crate::types")]
#[surreal(untagged, lowercase)]
pub enum PatchOp {
Add {
path: String,
value: Value,
},
Remove {
path: String,
},
Replace {
path: String,
value: Value,
},
Change {
path: String,
value: String,
},
}
impl From<PatchOp> for Value {
fn from(op: PatchOp) -> Value {
let mut obj = crate::types::Object::new();
match op {
PatchOp::Add {
path,
value,
} => {
obj.insert("op".to_string(), Value::String("add".to_string()));
obj.insert("path".to_string(), Value::String(path));
obj.insert("value".to_string(), value);
}
PatchOp::Remove {
path,
} => {
obj.insert("op".to_string(), Value::String("remove".to_string()));
obj.insert("path".to_string(), Value::String(path));
}
PatchOp::Replace {
path,
value,
} => {
obj.insert("op".to_string(), Value::String("replace".to_string()));
obj.insert("path".to_string(), Value::String(path));
obj.insert("value".to_string(), value);
}
PatchOp::Change {
path,
value,
} => {
obj.insert("op".to_string(), Value::String("change".to_string()));
obj.insert("path".to_string(), Value::String(path));
obj.insert("value".to_string(), Value::String(value));
}
}
Value::Object(obj)
}
}
impl PatchOp {
pub fn add(path: impl Into<String>, value: impl SurrealValue) -> Self {
PatchOp::Add {
path: path.into(),
value: value.into_value(),
}
}
pub fn remove(path: impl Into<String>) -> Self {
PatchOp::Remove {
path: path.into(),
}
}
pub fn replace(path: impl Into<String>, value: impl SurrealValue) -> Self {
PatchOp::Replace {
path: path.into(),
value: value.into_value(),
}
}
pub fn change(path: impl Into<String>, diff: String) -> Self {
PatchOp::Change {
path: path.into(),
value: diff,
}
}
}
#[derive(Debug, Default)]
#[must_use]
pub struct PatchOps(pub(crate) Vec<PatchOp>);
impl From<PatchOp> for PatchOps {
fn from(op: PatchOp) -> Self {
Self(vec![op])
}
}
impl From<Vec<PatchOp>> for PatchOps {
fn from(ops: Vec<PatchOp>) -> Self {
Self(ops)
}
}
impl PatchOps {
pub const fn new() -> Self {
Self(Vec::new())
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn push(mut self, patch: PatchOp) -> Self {
self.0.push(patch);
self
}
pub fn add<T>(mut self, path: &str, value: T) -> Self
where
T: SurrealValue,
{
self.0.push(PatchOp::add(path, value));
self
}
pub fn remove(mut self, path: &str) -> Self {
self.0.push(PatchOp::remove(path));
self
}
pub fn replace<T>(mut self, path: &str, value: T) -> Self
where
T: SurrealValue,
{
self.0.push(PatchOp::replace(path, value));
self
}
pub fn change(mut self, path: &str, diff: String) -> Self {
self.0.push(PatchOp::change(path, diff));
self
}
}
impl IntoIterator for PatchOps {
type Item = PatchOp;
type IntoIter = std::vec::IntoIter<PatchOp>;
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[non_exhaustive]
pub enum WaitFor {
Connection,
Database,
}