1use serde::{Deserialize, Serialize};
2use chrono::{DateTime, Utc};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5pub enum ClaimType {
6 Date,
7 Identity,
8 Amount,
9 Signature,
10 Presence,
11 Comparative,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub enum ClaimQuery {
16 Date(DateClaim),
17 Identity(IdentityClaim),
18 Amount(AmountClaim),
19 Signature(SignatureClaim),
20 Presence(PresenceClaim),
21 Comparative(ComparativeClaim),
22}
23
24impl ClaimQuery {
25 pub fn claim_type(&self) -> ClaimType {
26 match self {
27 ClaimQuery::Date(_) => ClaimType::Date,
28 ClaimQuery::Identity(_) => ClaimType::Identity,
29 ClaimQuery::Amount(_) => ClaimType::Amount,
30 ClaimQuery::Signature(_) => ClaimType::Signature,
31 ClaimQuery::Presence(_) => ClaimType::Presence,
32 ClaimQuery::Comparative(_) => ClaimType::Comparative,
33 }
34 }
35
36 pub fn is_deterministic(&self) -> bool {
37 matches!(self.claim_type(), ClaimType::Date | ClaimType::Amount | ClaimType::Presence)
38 }
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct DateClaim {
43 pub operation: DateOperation,
44 pub threshold: Option<DateTime<Utc>>,
45 pub age_threshold: Option<u32>,
46 pub days_threshold: Option<i64>,
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub enum DateOperation {
51 AgeGreaterThan,
52 AgeLessThan,
53 IssuedWithinDays,
54 ExpiresAfter,
55 IsBetween { start: DateTime<Utc>, end: DateTime<Utc> },
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct IdentityClaim {
60 pub field: IdentityField,
61 pub expected_value: Option<String>,
62 pub operation: IdentityOperation,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub enum IdentityField {
67 Name,
68 CPF,
69 RG,
70 Passport,
71 Email,
72 Phone,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub enum IdentityOperation {
77 Matches,
78 Contains,
79 StartsWith,
80 HashMatches,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct AmountClaim {
85 pub field: String,
86 pub operation: AmountOperation,
87 pub threshold: f64,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub enum AmountOperation {
92 GreaterThan,
93 LessThan,
94 EqualTo,
95 Between { min: f64, max: f64 },
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize)]
99pub struct SignatureClaim {
100 pub required_signers: Vec<String>,
101 pub all_required: bool,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct PresenceClaim {
106 pub field: String,
107 pub must_exist: bool,
108 pub must_not_be_empty: bool,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112pub struct ComparativeClaim {
113 pub field1: String,
114 pub field2: String,
115 pub operation: ComparativeOperation,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub enum ComparativeOperation {
120 Equal,
121 NotEqual,
122 Greater,
123 Less,
124}