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