bluejay_validator/executable/operation/analyzers/complexity_cost/
cost_computer.rs

1use crate::executable::operation::VariableValues;
2use bluejay_core::definition::SchemaDefinition;
3use bluejay_core::executable::ExecutableDocument;
4
5pub trait CostComputer<'a, E: ExecutableDocument, S: SchemaDefinition, V: VariableValues> {
6    type FieldMultipliers: FieldMultipliers<E>;
7
8    fn new(
9        operation_definition: &'a E::OperationDefinition,
10        schema_definition: &'a S,
11        variable_values: &'a V,
12    ) -> Self;
13
14    fn cost_for_field_definition(&self, field_definition: &S::FieldDefinition) -> usize;
15
16    fn field_multipliers(
17        &self,
18        field_definition: &S::FieldDefinition,
19        field: &E::Field,
20    ) -> Self::FieldMultipliers;
21}
22
23pub trait FieldMultipliers<E: ExecutableDocument>: Default {
24    fn multiplier_for_field(&self, field: &E::Field) -> usize;
25}
26
27pub struct DefaultCostComputer;
28
29impl<'a, E: ExecutableDocument, S: SchemaDefinition, V: VariableValues> CostComputer<'a, E, S, V>
30    for DefaultCostComputer
31{
32    type FieldMultipliers = UnitFieldMultipliers;
33
34    fn new(_: &'a E::OperationDefinition, _: &'a S, _: &'a V) -> Self {
35        Self
36    }
37
38    fn cost_for_field_definition(&self, _: &<S as SchemaDefinition>::FieldDefinition) -> usize {
39        1
40    }
41
42    fn field_multipliers(
43        &self,
44        _: &<S as SchemaDefinition>::FieldDefinition,
45        _: &<E as ExecutableDocument>::Field,
46    ) -> UnitFieldMultipliers {
47        UnitFieldMultipliers
48    }
49}
50
51#[derive(Default)]
52pub struct UnitFieldMultipliers;
53
54impl<E: ExecutableDocument> FieldMultipliers<E> for UnitFieldMultipliers {
55    fn multiplier_for_field(&self, _: &E::Field) -> usize {
56        1
57    }
58}