Skip to main content

graphrecords_query/capabilities/
kind.rs

1use crate::{AttributeName, IndexValue, Scalar, ValueDomain};
2use graphrecords_core::graphrecord::{GraphRecordAttribute, GraphRecordValue, NodeIndex};
3
4#[derive(Clone, Copy, PartialEq, Eq)]
5pub enum PayloadKind {
6    Bool,
7    Int,
8    Float,
9    String,
10    DateTime,
11    Duration,
12    Null,
13}
14
15pub trait ValueKindTest: ValueDomain {
16    fn kind(value: &Self::Value<'_>) -> PayloadKind;
17}
18
19pub trait ValueScalarKindTest: ValueKindTest {}
20
21const fn graphrecord_value_kind(value: &GraphRecordValue) -> PayloadKind {
22    match value {
23        GraphRecordValue::String(_) => PayloadKind::String,
24        GraphRecordValue::Int(_) => PayloadKind::Int,
25        GraphRecordValue::Float(_) => PayloadKind::Float,
26        GraphRecordValue::Bool(_) => PayloadKind::Bool,
27        GraphRecordValue::DateTime(_) => PayloadKind::DateTime,
28        GraphRecordValue::Duration(_) => PayloadKind::Duration,
29        GraphRecordValue::Null => PayloadKind::Null,
30    }
31}
32
33const fn graphrecord_attribute_kind(attribute: &GraphRecordAttribute) -> PayloadKind {
34    match attribute {
35        GraphRecordAttribute::Int(_) => PayloadKind::Int,
36        GraphRecordAttribute::String(_) => PayloadKind::String,
37    }
38}
39
40impl ValueKindTest for Scalar {
41    fn kind(value: &Self::Value<'_>) -> PayloadKind {
42        graphrecord_value_kind(value)
43    }
44}
45
46impl ValueScalarKindTest for Scalar {}
47
48impl ValueKindTest for AttributeName {
49    fn kind(value: &Self::Value<'_>) -> PayloadKind {
50        graphrecord_attribute_kind(value)
51    }
52}
53
54impl ValueKindTest for IndexValue<GraphRecordValue> {
55    fn kind(value: &Self::Value<'_>) -> PayloadKind {
56        graphrecord_value_kind(value)
57    }
58}
59
60impl ValueScalarKindTest for IndexValue<GraphRecordValue> {}
61
62impl ValueKindTest for IndexValue<NodeIndex> {
63    fn kind(value: &Self::Value<'_>) -> PayloadKind {
64        graphrecord_attribute_kind(value)
65    }
66}
67
68impl ValueKindTest for IndexValue<AttributeName> {
69    fn kind(value: &Self::Value<'_>) -> PayloadKind {
70        graphrecord_attribute_kind(value)
71    }
72}