rusty_gql/types/
directive.rs

1use std::collections::BTreeMap;
2
3use graphql_parser::{
4    schema::{Directive, DirectiveLocation},
5    Pos,
6};
7
8use crate::GqlValueType;
9
10use super::{argument::InputValueType, value::GqlValue};
11
12#[derive(Debug, Clone)]
13pub struct GqlDirective {
14    pub position: Pos,
15    pub name: String,
16    pub arguments: BTreeMap<String, GqlValue>,
17}
18
19impl GqlDirective {
20    pub fn from_vec_directive(directives: Vec<Directive<'_, String>>) -> Vec<GqlDirective> {
21        directives.into_iter().map(GqlDirective::from).collect()
22    }
23}
24
25impl<'a> From<Directive<'a, String>> for GqlDirective {
26    fn from(directive: Directive<'a, String>) -> Self {
27        let mut arguments = BTreeMap::new();
28        for (key, value) in directive.arguments {
29            let gql_value = GqlValue::from(value);
30            arguments.insert(key, gql_value);
31        }
32        GqlDirective {
33            position: directive.position,
34            name: directive.name,
35            arguments,
36        }
37    }
38}
39
40#[derive(Debug)]
41pub struct DirectiveDefinition {
42    pub position: Pos,
43    pub name: String,
44    pub description: Option<String>,
45    pub arguments: Vec<InputValueType>,
46    pub locations: Vec<DirectiveLocation>,
47}
48
49impl DirectiveDefinition {
50    pub fn skip_directive() -> Self {
51        DirectiveDefinition {
52            position: Pos::default(),
53            name: "skip".to_string(),
54            description: None,
55            arguments: vec![InputValueType {
56                name: "if".to_string(),
57                description: None,
58                position: Pos::default(),
59                meta_type: GqlValueType::NonNullType(Box::new(GqlValueType::NamedType(
60                    "Boolean".to_string(),
61                ))),
62                default_value: None,
63                directives: Default::default(),
64            }],
65            locations: vec![
66                DirectiveLocation::Field,
67                DirectiveLocation::FragmentSpread,
68                DirectiveLocation::InlineFragment,
69            ],
70        }
71    }
72
73    pub fn include_directive() -> Self {
74        DirectiveDefinition {
75            position: Pos::default(),
76            name: "include".to_string(),
77            description: None,
78            arguments: vec![InputValueType {
79                name: "if".to_string(),
80                description: None,
81                position: Pos::default(),
82                meta_type: GqlValueType::NonNullType(Box::new(GqlValueType::NamedType(
83                    "Boolean".to_string(),
84                ))),
85                default_value: None,
86                directives: Default::default(),
87            }],
88            locations: vec![
89                DirectiveLocation::Field,
90                DirectiveLocation::FragmentSpread,
91                DirectiveLocation::InlineFragment,
92            ],
93        }
94    }
95
96    pub fn deprecated_directive() -> Self {
97        DirectiveDefinition {
98            position: Pos::default(),
99            name: "deprecated".to_string(),
100            description: None,
101            arguments: vec![InputValueType {
102                name: "reason".to_string(),
103                description: None,
104                position: Pos::default(),
105                meta_type: GqlValueType::NamedType("String".to_string()),
106                default_value: None,
107                directives: Default::default(),
108            }],
109            locations: vec![
110                DirectiveLocation::FieldDefinition,
111                DirectiveLocation::EnumValue,
112            ],
113        }
114    }
115}