cynic_querygen/output/
variables_struct.rs

1use std::{borrow::Cow, collections::HashMap};
2
3use crate::casings::CasingExt;
4
5use crate::{query_parsing::Variable, schema::TypeSpec};
6
7#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct VariablesStruct<'query, 'schema> {
9    name: String,
10    fields: Vec<VariablesStructField<'query, 'schema>>,
11}
12
13impl<'query, 'schema> VariablesStruct<'query, 'schema> {
14    pub fn new(name: String, fields: Vec<VariablesStructField<'query, 'schema>>) -> Self {
15        VariablesStruct { name, fields }
16    }
17}
18
19#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
20pub enum VariablesStructField<'query, 'schema> {
21    Variable(Variable<'query, 'schema>),
22    NestedStruct(String),
23}
24
25impl VariablesStructField<'_, '_> {
26    fn name(&self) -> String {
27        match self {
28            VariablesStructField::Variable(var) => var.name.to_snake_case(),
29            VariablesStructField::NestedStruct(type_name) => type_name.to_snake_case(),
30        }
31    }
32
33    fn type_spec(&self, input_objects_need_lifetime: &HashMap<&str, bool>) -> TypeSpec<'_> {
34        match self {
35            VariablesStructField::Variable(var) => var.value_type.type_spec(
36                false,
37                input_objects_need_lifetime
38                    .get(&*var.value_type.inner_name())
39                    .copied()
40                    .unwrap_or(false),
41            ),
42            VariablesStructField::NestedStruct(type_name) => TypeSpec {
43                name: Cow::Borrowed(type_name),
44                contains_lifetime_a: input_objects_need_lifetime
45                    .get(type_name.as_str())
46                    .copied()
47                    .unwrap_or(false),
48            },
49        }
50    }
51}
52
53pub struct VariablesStructForDisplay<'v, 'i, 'q, 's> {
54    pub variables_struct: &'v VariablesStruct<'q, 's>,
55    pub input_objects_need_lifetime: &'i HashMap<&'i str, bool>,
56}
57
58impl std::fmt::Display for VariablesStructForDisplay<'_, '_, '_, '_> {
59    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60        use {super::indented, std::fmt::Write};
61
62        writeln!(f, "#[derive(cynic::QueryVariables, Debug)]")?;
63        let type_specs: Vec<_> = self
64            .variables_struct
65            .fields
66            .iter()
67            .map(|f| f.type_spec(self.input_objects_need_lifetime))
68            .collect();
69        writeln!(
70            f,
71            "pub struct {}{} {{",
72            self.variables_struct.name,
73            TypeSpec::lifetime(&type_specs)
74        )?;
75
76        for (field, type_spec) in self.variables_struct.fields.iter().zip(type_specs) {
77            write!(
78                indented(f, 4),
79                "{}",
80                super::Field::new(&field.name(), &type_spec)
81            )?;
82        }
83        writeln!(f, "}}")
84    }
85}