solomon_gremlin/structure/
p.rs1use crate::structure::either::Either2;
2use crate::structure::text_p::TextP;
3use crate::{GValue, ToGValue};
4
5#[derive(Debug, PartialEq, Clone)]
6pub struct Predicate {
7 pub(crate) operator: String,
8 pub(crate) value: Box<GValue>,
9}
10
11impl Predicate {
12 pub fn operator(&self) -> &String {
13 &self.operator
14 }
15
16 pub fn value(&self) -> &GValue {
17 &self.value
18 }
19
20 pub(crate) fn new<T>(operator: T, value: GValue) -> Predicate
21 where
22 T: Into<String>,
23 {
24 Predicate {
25 operator: operator.into(),
26 value: Box::new(value),
27 }
28 }
29 pub fn eq<V>(value: V) -> Predicate
30 where
31 V: ToGValue,
32 {
33 Predicate::new("eq", value.to_gvalue())
34 }
35
36 pub fn neq<V>(value: V) -> Predicate
37 where
38 V: ToGValue,
39 {
40 Predicate::new("neq", value.to_gvalue())
41 }
42
43 pub fn gt<V>(value: V) -> Predicate
44 where
45 V: ToGValue,
46 {
47 Predicate::new("gt", value.to_gvalue())
48 }
49
50 pub fn gte<V>(value: V) -> Predicate
51 where
52 V: ToGValue,
53 {
54 Predicate::new("gte", value.to_gvalue())
55 }
56
57 pub fn lt<V>(value: V) -> Predicate
58 where
59 V: ToGValue,
60 {
61 Predicate::new("lt", value.to_gvalue())
62 }
63
64 pub fn lte<V>(value: V) -> Predicate
65 where
66 V: ToGValue,
67 {
68 Predicate::new("lte", value.to_gvalue())
69 }
70
71 pub fn within<V>(value: V) -> Predicate
72 where
73 V: IntoRange,
74 {
75 Predicate::new("within", value.into_range().values.into())
76 }
77}
78
79pub trait IntoPredicate {
80 fn into_predicate(self) -> Either2<Predicate, TextP>;
81}
82
83impl<T: ToGValue> IntoPredicate for T {
84 fn into_predicate(self) -> Either2<Predicate, TextP> {
85 let val = self.to_gvalue();
86 match val {
87 GValue::P(ref p) => Either2::A(p.clone()),
88 GValue::TextP(ref p) => Either2::B(p.clone()),
89 _ => Either2::A(Predicate::new("eq", val)),
90 }
91 }
92}
93
94pub struct Range {
95 values: Vec<GValue>,
96}
97
98pub trait IntoRange {
99 fn into_range(self) -> Range;
100}
101
102impl<T> IntoRange for (T, T)
103where
104 T: ToGValue,
105{
106 fn into_range(self) -> Range {
107 let v1 = self.0.to_gvalue();
108 let v2 = self.1.to_gvalue();
109
110 Range {
111 values: vec![v1, v2],
112 }
113 }
114}
115
116impl<T> IntoRange for Vec<T>
117where
118 T: ToGValue,
119{
120 fn into_range(self) -> Range {
121 Range {
122 values: self.into_iter().map(|e| e.to_gvalue()).collect(),
123 }
124 }
125}