use darling::ast::{Data, Fields}; use darling::util::Ignored; use darling::{FromDeriveInput, FromField, FromMeta, FromVariant}; use syn::{Attribute, Generics, Ident, Lit, LitStr, Meta, Type, Visibility}; #[derive(FromMeta)] #[darling(default)] pub struct CacheControl { public: bool, private: bool, pub max_age: usize, } impl Default for CacheControl { fn default() -> Self { Self { public: true, private: false, max_age: 0, } } } impl CacheControl { pub fn is_public(&self) -> bool { !self.private && self.public } } #[derive(Debug)] pub enum DefaultValue { Default, Value(Lit), } impl FromMeta for DefaultValue { fn from_word() -> darling::Result { Ok(DefaultValue::Default) } fn from_value(value: &Lit) -> darling::Result { Ok(DefaultValue::Value(value.clone())) } } #[derive(FromField)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct SimpleObjectField { pub ident: Option, pub ty: Type, pub vis: Visibility, pub attrs: Vec, #[darling(default)] pub skip: bool, #[darling(default)] pub name: Option, #[darling(default)] pub deprecation: Option, #[darling(default)] pub owned: bool, #[darling(default)] pub cache_control: CacheControl, #[darling(default)] pub external: bool, #[darling(default)] pub provides: Option, #[darling(default)] pub requires: Option, #[darling(default)] pub guard: Option, #[darling(default)] pub post_guard: Option, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct SimpleObject { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, #[darling(default)] pub cache_control: CacheControl, #[darling(default)] pub extends: bool, } #[derive(FromMeta, Default)] #[darling(default)] pub struct Argument { pub name: Option, pub desc: Option, pub default: Option, pub default_with: Option, pub validator: Option, pub key: bool, // for entity } #[derive(FromMeta, Default)] #[darling(default)] pub struct Object { pub internal: bool, pub name: Option, pub cache_control: CacheControl, pub extends: bool, } #[derive(FromMeta, Default)] #[darling(default)] pub struct ObjectField { pub skip: bool, pub entity: bool, pub name: Option, pub deprecation: Option, pub cache_control: CacheControl, pub external: bool, pub provides: Option, pub requires: Option, pub guard: Option, pub post_guard: Option, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct Enum { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, #[darling(default)] pub remote: Option, } #[derive(FromVariant)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct EnumItem { pub ident: Ident, pub attrs: Vec, pub fields: Fields, #[darling(default)] pub name: Option, #[darling(default)] pub deprecation: Option, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct Union { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, } #[derive(FromVariant)] #[darling(attributes(graphql))] pub struct UnionItem { pub ident: Ident, pub fields: Fields, #[darling(default)] pub flatten: bool, } #[derive(FromField)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct InputObjectField { pub ident: Option, pub ty: Type, pub vis: Visibility, pub attrs: Vec, #[darling(default)] pub name: Option, #[darling(default)] pub default: Option, #[darling(default)] pub default_with: Option, #[darling(default)] pub validator: Option, #[darling(default)] pub flatten: bool, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct InputObject { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, } #[derive(FromMeta)] pub struct InterfaceFieldArgument { pub name: String, #[darling(default)] pub desc: Option, #[darling(rename = "type")] pub ty: LitStr, #[darling(default)] pub default: Option, #[darling(default)] pub default_with: Option, } #[derive(FromMeta)] pub struct InterfaceField { pub name: String, #[darling(rename = "type")] pub ty: LitStr, #[darling(default)] pub method: Option, #[darling(default)] pub desc: Option, #[darling(default, multiple, rename = "arg")] pub args: Vec, #[darling(default)] pub deprecation: Option, #[darling(default)] pub external: bool, #[darling(default)] pub provides: Option, #[darling(default)] pub requires: Option, } #[derive(FromVariant)] pub struct InterfaceMember { pub ident: Ident, pub fields: Fields, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct Interface { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, #[darling(default, multiple, rename = "field")] pub fields: Vec, #[darling(default)] pub extends: bool, } #[derive(FromMeta, Default)] #[darling(default)] pub struct Scalar { pub internal: bool, pub name: Option, } #[derive(FromMeta, Default)] #[darling(default)] pub struct Subscription { pub internal: bool, pub name: Option, } #[derive(FromMeta, Default)] #[darling(default)] pub struct SubscriptionFieldArgument { pub name: Option, pub desc: Option, pub default: Option, pub default_with: Option, pub validator: Option, } #[derive(FromMeta, Default)] #[darling(default)] pub struct SubscriptionField { pub skip: bool, pub name: Option, pub deprecation: Option, pub guard: Option, pub post_guard: Option, } #[derive(FromMeta, Default)] #[darling(default, allow_unknown_fields)] pub struct SubscriptionFieldWrapper { pub graphql: SubscriptionField, } #[derive(FromField)] pub struct MergedObjectField { pub ident: Option, pub ty: Type, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct MergedObject { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, #[darling(default)] pub cache_control: CacheControl, #[darling(default)] pub extends: bool, } #[derive(FromField)] pub struct MergedSubscriptionField { pub ident: Option, pub ty: Type, } #[derive(FromDeriveInput)] #[darling(attributes(graphql), forward_attrs(doc))] pub struct MergedSubscription { pub ident: Ident, pub generics: Generics, pub attrs: Vec, pub data: Data, #[darling(default)] pub internal: bool, #[darling(default)] pub name: Option, }