graphql_federated_graph/federated_graph/
enum_values.rs

1use super::{Directive, EnumDefinitionId, EnumValueId, FederatedGraph, StringId, View, ViewNested};
2
3pub type EnumValue<'a> = ViewNested<'a, EnumValueId, EnumValueRecord>;
4
5impl std::fmt::Debug for EnumValue<'_> {
6    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7        f.debug_struct("EnumValueDefinition")
8            .field("enum", &self.then(|v| v.enum_id).then(|enm| enm.name).as_str())
9            .field("value", &self.then(|v| v.value).as_str())
10            .finish_non_exhaustive()
11    }
12}
13
14#[derive(Clone, Debug)]
15pub struct EnumValueRecord {
16    pub enum_id: EnumDefinitionId,
17    pub value: StringId,
18    pub directives: Vec<Directive>,
19    pub description: Option<StringId>,
20}
21
22impl FederatedGraph {
23    pub fn enum_value_range(&self, enum_id: EnumDefinitionId) -> (EnumValueId, usize) {
24        let mut values = self.iter_enum_values(enum_id);
25        let Some(start) = values.next() else {
26            return (EnumValueId::from(0), 0);
27        };
28
29        (start.id(), values.count() + 1)
30    }
31
32    pub fn find_enum_value_by_name(&self, enum_id: EnumDefinitionId, name: &str) -> Option<EnumValue<'_>> {
33        self.iter_enum_values(enum_id).find(|value| self[value.value] == name)
34    }
35
36    pub fn find_enum_value_by_name_id(&self, enum_id: EnumDefinitionId, name_id: StringId) -> Option<EnumValue<'_>> {
37        self.iter_enum_values(enum_id).find(|value| value.value == name_id)
38    }
39
40    pub fn iter_enum_values(&self, enum_id: EnumDefinitionId) -> impl Iterator<Item = EnumValue<'_>> + Clone {
41        let start = self.enum_values.partition_point(|value| value.enum_id < enum_id);
42        self.enum_values[start..]
43            .iter()
44            .enumerate()
45            .take_while(move |(_idx, value)| value.enum_id == enum_id)
46            .map(move |(idx, value)| ViewNested {
47                view: View {
48                    id: EnumValueId::from(start + idx),
49                    record: value,
50                },
51                graph: self,
52            })
53    }
54
55    pub fn push_enum_value(&mut self, enum_value: EnumValueRecord) -> EnumValueId {
56        let id = self.enum_values.len().into();
57        self.enum_values.push(enum_value);
58        id
59    }
60}