Make create API more flexible (#4797)

This commit is contained in:
Rushmore Mushambi 2024-09-17 14:47:36 +01:00 committed by GitHub
parent 439ab99e15
commit 9c155fd317
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 76 additions and 37 deletions

View file

@ -78,17 +78,6 @@ where
into_future! {execute_opt} into_future! {execute_opt}
} }
impl<'r, Client, R> IntoFuture for Create<'r, Client, Vec<R>>
where
Client: Connection,
R: DeserializeOwned,
{
type Output = Result<Option<R>>;
type IntoFuture = BoxFuture<'r, Self::Output>;
into_future! {execute_opt}
}
impl<'r, C> Create<'r, C, Value> impl<'r, C> Create<'r, C, Value>
where where
C: Connection, C: Connection,
@ -138,28 +127,3 @@ where
}) })
} }
} }
impl<'r, C, R> Create<'r, C, Vec<R>>
where
C: Connection,
{
/// Sets content of a record
pub fn content<D>(self, data: D) -> Content<'r, C, Option<R>>
where
D: Serialize + 'static,
{
Content::from_closure(self.client, || {
let content = to_core_value(data)?;
let data = match content {
CoreValue::None | CoreValue::Null => None,
content => Some(content),
};
Ok(Command::Create {
what: self.resource?,
data,
})
})
}
}

View file

@ -92,6 +92,7 @@ pub use use_db::UseDb;
pub use use_ns::UseNs; pub use use_ns::UseNs;
pub use version::Version; pub use version::Version;
use super::opt::CreateResource;
use super::opt::IntoResource; use super::opt::IntoResource;
/// A alias for an often used type of future returned by async methods in this library. /// A alias for an often used type of future returned by async methods in this library.
@ -749,7 +750,7 @@ where
/// # Ok(()) /// # Ok(())
/// # } /// # }
/// ``` /// ```
pub fn create<R>(&self, resource: impl IntoResource<R>) -> Create<C, R> { pub fn create<R>(&self, resource: impl CreateResource<R>) -> Create<C, R> {
Create { Create {
client: Cow::Borrowed(self), client: Cow::Borrowed(self),
resource: resource.into_resource(), resource: resource.into_resource(),

View file

@ -315,6 +315,11 @@ pub trait IntoResource<Output> {
fn into_resource(self) -> Result<Resource>; fn into_resource(self) -> Result<Resource>;
} }
/// A trait for types which can be used as a resource selection for a query that returns an `Option`.
pub trait CreateResource<Output> {
fn into_resource(self) -> Result<Resource>;
}
fn no_colon(a: &str) -> Result<()> { fn no_colon(a: &str) -> Result<()> {
if a.contains(':') { if a.contains(':') {
return Err(Error::TableColonId { return Err(Error::TableColonId {
@ -325,6 +330,8 @@ fn no_colon(a: &str) -> Result<()> {
Ok(()) Ok(())
} }
// IntoResource
impl IntoResource<Value> for Resource { impl IntoResource<Value> for Resource {
fn into_resource(self) -> Result<Resource> { fn into_resource(self) -> Result<Resource> {
Ok(self) Ok(self)
@ -413,3 +420,70 @@ impl<R> IntoResource<Vec<R>> for () {
Ok(Resource::Unspecified) Ok(Resource::Unspecified)
} }
} }
// CreateResource
impl CreateResource<Value> for Resource {
fn into_resource(self) -> Result<Resource> {
Ok(self)
}
}
impl<R> CreateResource<Option<R>> for Object {
fn into_resource(self) -> Result<Resource> {
Ok(self.into())
}
}
impl<R> CreateResource<Option<R>> for RecordId {
fn into_resource(self) -> Result<Resource> {
Ok(self.into())
}
}
impl<R> CreateResource<Option<R>> for &RecordId {
fn into_resource(self) -> Result<Resource> {
Ok(self.clone().into())
}
}
impl<R, T, I> CreateResource<Option<R>> for (T, I)
where
T: Into<String>,
I: Into<RecordIdKey>,
{
fn into_resource(self) -> Result<Resource> {
Ok(self.into())
}
}
impl<T, R> CreateResource<Option<R>> for Table<T>
where
T: Into<String>,
{
fn into_resource(self) -> Result<Resource> {
let t = self.0.into();
Ok(t.into())
}
}
impl<R> CreateResource<Option<R>> for &str {
fn into_resource(self) -> Result<Resource> {
no_colon(self)?;
Ok(self.into())
}
}
impl<R> CreateResource<Option<R>> for String {
fn into_resource(self) -> Result<Resource> {
no_colon(&self)?;
Ok(self.into())
}
}
impl<R> CreateResource<Option<R>> for &String {
fn into_resource(self) -> Result<Resource> {
no_colon(self)?;
Ok(self.into())
}
}