bluejay_core/executable/
selection.rs

1use 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}