Merge pull request #896 from boardmaster357/master

Implemented OutputType for tokio RwLock
This commit is contained in:
Sunli 2022-04-28 14:58:19 +08:00 committed by GitHub
commit 7b384a3d4d
6 changed files with 60 additions and 0 deletions

View File

@ -24,6 +24,7 @@ decimal = ["rust_decimal"]
cbor = ["serde_cbor"]
chrono-duration = ["chrono", "iso8601-duration"]
password-strength-validator = ["zxcvbn"]
tokio-sync = ["tokio"]
[dependencies]
async-graphql-derive = { path = "derive", version = "3.0.38" }
@ -66,6 +67,7 @@ rust_decimal = { version = "1.14.3", optional = true }
url = { version = "2.2.1", optional = true }
smol_str = { version = "0.1.21", optional = true }
time = { version = "0.3.5", optional = true, features = ["parsing", "formatting", "macros"] }
tokio = { version = "1.17.0", features = ["sync"], optional = true }
# Non-feature optional dependencies
blocking = { version = "1.0.2", optional = true }

View File

@ -11,6 +11,7 @@ mod list;
mod non_zero_integers;
mod optional;
mod string;
mod tokio;
#[cfg(feature = "bson")]
mod bson;

1
src/types/external/tokio/mod.rs vendored Normal file
View File

@ -0,0 +1 @@
pub mod sync;

4
src/types/external/tokio/sync/mod.rs vendored Normal file
View File

@ -0,0 +1,4 @@
#[cfg(feature = "tokio-sync")]
mod rw_lock;
#[cfg(feature = "tokio-sync")]
mod mutex;

26
src/types/external/tokio/sync/mutex.rs vendored Normal file
View File

@ -0,0 +1,26 @@
use tokio::sync::Mutex;
use std::borrow::Cow;
use async_graphql_parser::types::Field;
use crate::{registry, ContextSelectionSet, OutputType, Positioned, ServerResult, Value};
#[async_trait::async_trait]
impl<T: OutputType> OutputType for Mutex<T>
{
fn type_name() -> Cow<'static, str> {
T::type_name()
}
fn create_type_info(registry: &mut registry::Registry) -> String {
<T as OutputType>::create_type_info(registry)
}
async fn resolve(
&self,
ctx: &ContextSelectionSet<'_>,
field: &Positioned<Field>,
) -> ServerResult<Value> {
self.lock().await.resolve(ctx, field).await
}
}

View File

@ -0,0 +1,26 @@
use tokio::sync::RwLock;
use std::borrow::Cow;
use async_graphql_parser::types::Field;
use crate::{registry, ContextSelectionSet, OutputType, Positioned, ServerResult, Value};
#[async_trait::async_trait]
impl<T: OutputType> OutputType for RwLock<T>
{
fn type_name() -> Cow<'static, str> {
T::type_name()
}
fn create_type_info(registry: &mut registry::Registry) -> String {
<T as OutputType>::create_type_info(registry)
}
async fn resolve(
&self,
ctx: &ContextSelectionSet<'_>,
field: &Positioned<Field>,
) -> ServerResult<Value> {
self.read().await.resolve(ctx, field).await
}
}