rusty_gql/types/
directive.rs1use 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}