graphql_federated_graph/federated_graph/
enum_values.rs1use 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}