use serde::Serialize;
use std::borrow::Cow;
pub mod auth;
pub mod capabilities;
mod config;
mod endpoint;
mod export;
mod query;
mod resource;
mod tls;
pub use config::*;
pub use endpoint::*;
pub use export::*;
pub use query::*;
pub use resource::*;
use serde_content::Serializer;
use serde_content::Value as Content;
#[cfg(any(feature = "native-tls", feature = "rustls"))]
pub use tls::*;
type UnitOp<'a> = InnerOp<'a, ()>;
#[derive(Debug, Serialize)]
#[serde(tag = "op", rename_all = "lowercase")]
enum InnerOp<'a, T> {
Add {
path: &'a str,
value: T,
},
Remove {
path: &'a str,
},
Replace {
path: &'a str,
value: T,
},
Change {
path: &'a str,
value: String,
},
}
#[derive(Debug)]
#[must_use]
pub struct PatchOp(pub(crate) serde_content::Result<Content<'static>>);
impl PatchOp {
pub fn add<T>(path: &str, value: T) -> Self
where
T: Serialize,
{
Self(Serializer::new().serialize(InnerOp::Add {
path,
value,
}))
}
pub fn remove(path: &str) -> Self {
Self(Serializer::new().serialize(UnitOp::Remove {
path,
}))
}
pub fn replace<T>(path: &str, value: T) -> Self
where
T: Serialize,
{
Self(Serializer::new().serialize(InnerOp::Replace {
path,
value,
}))
}
pub fn change(path: &str, diff: String) -> Self {
Self(Serializer::new().serialize(UnitOp::Change {
path,
value: diff,
}))
}
}
#[derive(Debug, Default)]
#[must_use]
pub struct PatchOps(Vec<PatchOp>);
impl From<PatchOps> for PatchOp {
fn from(ops: PatchOps) -> Self {
let mut merged = PatchOp(Ok(Content::Seq(Vec::with_capacity(ops.0.len()))));
for PatchOp(result) in ops.0 {
if let Ok(Content::Seq(value)) = &mut merged.0 {
match result {
Ok(op) => value.push(op),
Err(error) => {
merged.0 = Err(error);
break;
}
}
}
}
merged
}
}
impl PatchOps {
pub const fn new() -> Self {
Self(Vec::new())
}
pub fn add<T>(mut self, path: &str, value: T) -> Self
where
T: Serialize,
{
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: Serialize,
{
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
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[non_exhaustive]
pub enum WaitFor {
Connection,
Database,
}
#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[doc(hidden)]
pub struct Raw(pub(crate) Cow<'static, str>);
impl From<&'static str> for Raw {
fn from(query: &'static str) -> Self {
Self(Cow::Borrowed(query))
}
}
impl From<String> for Raw {
fn from(query: String) -> Self {
Self(Cow::Owned(query))
}
}