bluejay_core/executable/
selection.rs1use crate::{
2 definition::DirectiveLocation,
3 executable::{Field, FragmentSpread, InlineFragment},
4};
5
6#[derive(Debug)]
7pub enum SelectionReference<'a, S: Selection> {
8 Field(&'a S::Field),
9 FragmentSpread(&'a S::FragmentSpread),
10 InlineFragment(&'a S::InlineFragment),
11}
12
13pub trait Selection: Sized {
14 type Field: Field;
15 type FragmentSpread: FragmentSpread<Directives = <Self::Field as Field>::Directives>;
16 type InlineFragment: InlineFragment<Directives = <Self::Field as Field>::Directives>;
17
18 fn as_ref(&self) -> SelectionReference<'_, Self>;
19}
20
21impl<'a, S: Selection> SelectionReference<'a, S> {
22 pub fn directives(&self) -> Option<&'a <S::Field as Field>::Directives> {
23 match self {
24 Self::Field(f) => f.directives(),
25 Self::FragmentSpread(fs) => fs.directives(),
26 Self::InlineFragment(i) => i.directives(),
27 }
28 }
29
30 pub fn associated_directive_location(&self) -> DirectiveLocation {
31 match self {
32 Self::Field(_) => DirectiveLocation::Field,
33 Self::FragmentSpread(_) => DirectiveLocation::FragmentSpread,
34 Self::InlineFragment(_) => DirectiveLocation::InlineFragment,
35 }
36 }
37}