diff --git a/Cargo.toml b/Cargo.toml index dc491d5db..86ba0b30c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 } diff --git a/src/types/external/mod.rs b/src/types/external/mod.rs index 3082e3045..0f164ef9b 100644 --- a/src/types/external/mod.rs +++ b/src/types/external/mod.rs @@ -11,6 +11,7 @@ mod list; mod non_zero_integers; mod optional; mod string; +mod tokio; #[cfg(feature = "bson")] mod bson; diff --git a/src/types/external/tokio/mod.rs b/src/types/external/tokio/mod.rs new file mode 100644 index 000000000..d086d5bd6 --- /dev/null +++ b/src/types/external/tokio/mod.rs @@ -0,0 +1 @@ +pub mod sync; diff --git a/src/types/external/tokio/sync/mod.rs b/src/types/external/tokio/sync/mod.rs new file mode 100644 index 000000000..86312700e --- /dev/null +++ b/src/types/external/tokio/sync/mod.rs @@ -0,0 +1,4 @@ +#[cfg(feature = "tokio-sync")] +mod rw_lock; +#[cfg(feature = "tokio-sync")] +mod mutex; diff --git a/src/types/external/tokio/sync/mutex.rs b/src/types/external/tokio/sync/mutex.rs new file mode 100644 index 000000000..42d1a6bc9 --- /dev/null +++ b/src/types/external/tokio/sync/mutex.rs @@ -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 OutputType for Mutex +{ + fn type_name() -> Cow<'static, str> { + T::type_name() + } + + fn create_type_info(registry: &mut registry::Registry) -> String { + ::create_type_info(registry) + } + + async fn resolve( + &self, + ctx: &ContextSelectionSet<'_>, + field: &Positioned, + ) -> ServerResult { + self.lock().await.resolve(ctx, field).await + } +} diff --git a/src/types/external/tokio/sync/rw_lock.rs b/src/types/external/tokio/sync/rw_lock.rs new file mode 100644 index 000000000..de28940b5 --- /dev/null +++ b/src/types/external/tokio/sync/rw_lock.rs @@ -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 OutputType for RwLock +{ + fn type_name() -> Cow<'static, str> { + T::type_name() + } + + fn create_type_info(registry: &mut registry::Registry) -> String { + ::create_type_info(registry) + } + + async fn resolve( + &self, + ctx: &ContextSelectionSet<'_>, + field: &Positioned, + ) -> ServerResult { + self.read().await.resolve(ctx, field).await + } +}