From ff6f97d7df8106375d4f5ecf2d624bcb6a0f8083 Mon Sep 17 00:00:00 2001 From: sunli Date: Sun, 10 May 2020 18:38:20 +0800 Subject: [PATCH] Add ToGraphQLCursor and ToGraphQLID traits. #54 --- src/lib.rs | 4 ++-- src/scalars/id.rs | 15 +++++++++++++++ src/scalars/mod.rs | 2 +- src/types/connection/cursor.rs | 15 +++++++++++++++ src/types/connection/mod.rs | 2 +- src/types/mod.rs | 4 +++- 6 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9be5d353..b2c8da29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -122,7 +122,7 @@ pub use error::{ pub use parser::{Pos, Positioned, Value}; pub use query::{IntoQueryBuilder, IntoQueryBuilderOpts, QueryBuilder, QueryResponse}; pub use registry::CacheControl; -pub use scalars::{Any, Json, ID}; +pub use scalars::{Any, Json, ToGraphQLID, ID}; pub use schema::Schema; pub use subscription::{ SimpleBroker, SubscriptionStream, SubscriptionStreams, SubscriptionTransport, @@ -130,7 +130,7 @@ pub use subscription::{ }; pub use types::{ Connection, Cursor, DataSource, EmptyEdgeFields, EmptyMutation, EmptySubscription, PageInfo, - QueryOperation, Upload, + QueryOperation, ToGraphQLCursor, Upload, }; pub use validation::ValidationMode; diff --git a/src/scalars/id.rs b/src/scalars/id.rs index 2db96c09..ee10f93b 100644 --- a/src/scalars/id.rs +++ b/src/scalars/id.rs @@ -98,6 +98,21 @@ impl PartialEq<&str> for ID { } } +/// Convert any type that implements Display to the ID type +pub trait ToGraphQLID { + #[allow(missing_docs)] + fn to_graphql_id(&self) -> ID; +} + +impl ToGraphQLID for T +where + T: std::fmt::Display, +{ + fn to_graphql_id(&self) -> ID { + ID(self.to_string()) + } +} + #[Scalar(internal)] impl ScalarType for ID { fn type_name() -> &'static str { diff --git a/src/scalars/mod.rs b/src/scalars/mod.rs index 755c2397..37be2ddb 100644 --- a/src/scalars/mod.rs +++ b/src/scalars/mod.rs @@ -15,7 +15,7 @@ mod bson; mod uuid; pub use any::Any; -pub use id::ID; +pub use id::{ToGraphQLID, ID}; pub use json::Json; #[cfg(test)] diff --git a/src/types/connection/cursor.rs b/src/types/connection/cursor.rs index 93108920..1022dda1 100644 --- a/src/types/connection/cursor.rs +++ b/src/types/connection/cursor.rs @@ -47,6 +47,21 @@ impl From for Cursor { } } +/// Convert any type that implements Display to the Cursor type +pub trait ToGraphQLCursor { + #[allow(missing_docs)] + fn to_graphql_cursor(&self) -> Cursor; +} + +impl ToGraphQLCursor for T +where + T: std::fmt::Display, +{ + fn to_graphql_cursor(&self) -> Cursor { + Cursor(self.to_string()) + } +} + #[Scalar(internal)] impl ScalarType for Cursor { fn type_name() -> &'static str { diff --git a/src/types/connection/mod.rs b/src/types/connection/mod.rs index 75613240..15f3b532 100644 --- a/src/types/connection/mod.rs +++ b/src/types/connection/mod.rs @@ -7,7 +7,7 @@ mod slice; use crate::{Context, FieldResult, ObjectType}; pub use connection_type::Connection; -pub use cursor::Cursor; +pub use cursor::{Cursor, ToGraphQLCursor}; pub use page_info::PageInfo; /// Connection query operation diff --git a/src/types/mod.rs b/src/types/mod.rs index 4d740656..f0521357 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -7,7 +7,9 @@ mod optional; mod query_root; mod upload; -pub use connection::{Connection, Cursor, DataSource, EmptyEdgeFields, PageInfo, QueryOperation}; +pub use connection::{ + Connection, Cursor, DataSource, EmptyEdgeFields, PageInfo, QueryOperation, ToGraphQLCursor, +}; pub use empty_mutation::EmptyMutation; pub use empty_subscription::EmptySubscription; pub use query_root::QueryRoot;