graphql_federated_graph/federated_graph/
entity.rs

1use super::{Definition, Directive, FederatedGraph, Interface, InterfaceId, Object, ObjectId, StringId};
2
3#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
4pub enum EntityDefinitionId {
5    Object(ObjectId),
6    Interface(InterfaceId),
7}
8
9impl From<EntityDefinitionId> for Definition {
10    fn from(entity_definition_id: EntityDefinitionId) -> Self {
11        match entity_definition_id {
12            EntityDefinitionId::Object(object_id) => Definition::Object(object_id),
13            EntityDefinitionId::Interface(interface_id) => Definition::Interface(interface_id),
14        }
15    }
16}
17
18impl From<ObjectId> for EntityDefinitionId {
19    fn from(object_id: ObjectId) -> Self {
20        EntityDefinitionId::Object(object_id)
21    }
22}
23
24impl From<InterfaceId> for EntityDefinitionId {
25    fn from(interface_id: InterfaceId) -> Self {
26        EntityDefinitionId::Interface(interface_id)
27    }
28}
29
30pub enum EntityDefinition<'a> {
31    Object(&'a Object),
32    Interface(&'a Interface),
33}
34
35impl<'a> EntityDefinition<'a> {
36    pub fn name(&self) -> StringId {
37        match self {
38            EntityDefinition::Object(obj) => obj.name,
39            EntityDefinition::Interface(interface) => interface.name,
40        }
41    }
42    pub fn directives(&'a self) -> impl Iterator<Item = &'a Directive> + 'a {
43        match self {
44            EntityDefinition::Object(obj) => obj.directives.iter(),
45            EntityDefinition::Interface(interface) => interface.directives.iter(),
46        }
47    }
48}
49
50impl FederatedGraph {
51    pub fn entity(&self, id: EntityDefinitionId) -> EntityDefinition<'_> {
52        match id {
53            EntityDefinitionId::Object(object_id) => {
54                let object = &self.objects[usize::from(object_id)];
55                EntityDefinition::Object(object)
56            }
57            EntityDefinitionId::Interface(interface_id) => {
58                let interface = &self.interfaces[usize::from(interface_id)];
59                EntityDefinition::Interface(interface)
60            }
61        }
62    }
63}