1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::executable::operation::VariableValues;
use bluejay_core::definition::SchemaDefinition;
use bluejay_core::executable::ExecutableDocument;

pub trait CostComputer<'a, E: ExecutableDocument, S: SchemaDefinition, V: VariableValues> {
    type FieldMultipliers: FieldMultipliers<E>;

    fn new(
        operation_definition: &'a E::OperationDefinition,
        schema_definition: &'a S,
        variable_values: &'a V,
    ) -> Self;

    fn cost_for_field_definition(&self, field_definition: &S::FieldDefinition) -> usize;

    fn field_multipliers(
        &self,
        field_definition: &S::FieldDefinition,
        field: &E::Field,
    ) -> Self::FieldMultipliers;
}

pub trait FieldMultipliers<E: ExecutableDocument>: Default {
    fn multiplier_for_field(&self, field: &E::Field) -> usize;
}

pub struct DefaultCostComputer;

impl<'a, E: ExecutableDocument, S: SchemaDefinition, V: VariableValues> CostComputer<'a, E, S, V>
    for DefaultCostComputer
{
    type FieldMultipliers = UnitFieldMultipliers;

    fn new(_: &'a E::OperationDefinition, _: &'a S, _: &'a V) -> Self {
        Self
    }

    fn cost_for_field_definition(&self, _: &<S as SchemaDefinition>::FieldDefinition) -> usize {
        1
    }

    fn field_multipliers(
        &self,
        _: &<S as SchemaDefinition>::FieldDefinition,
        _: &<E as ExecutableDocument>::Field,
    ) -> UnitFieldMultipliers {
        UnitFieldMultipliers
    }
}

#[derive(Default)]
pub struct UnitFieldMultipliers;

impl<E: ExecutableDocument> FieldMultipliers<E> for UnitFieldMultipliers {
    fn multiplier_for_field(&self, _: &E::Field) -> usize {
        1
    }
}