cynic_querygen/output/
variables_struct.rs1use 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}