Skip to main content

ave_core/validation/
request.rs

1use crate::{
2    model::event::{ApprovalData, EvaluationData, ValidationData},
3    subject::Metadata,
4};
5
6use ave_common::{
7    Namespace, SchemaType,
8    bridge::request::EventRequestType,
9    identity::{DigestIdentifier, Signed},
10    request::EventRequest,
11};
12use borsh::{BorshDeserialize, BorshSerialize};
13use serde::{Deserialize, Serialize};
14
15/// A struct representing a validation request.
16#[derive(
17    Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize,
18)]
19pub enum ValidationReq {
20    Create {
21        subject_id: DigestIdentifier,
22        event_request: Signed<EventRequest>,
23        gov_version: u64,
24    },
25    Event {
26        actual_protocols: Box<ActualProtocols>,
27        event_request: Signed<EventRequest>,
28        ledger_hash: DigestIdentifier,
29        metadata: Box<Metadata>,
30        last_data: Box<LastData>,
31        gov_version: u64,
32        sn: u64,
33    },
34}
35
36impl ValidationReq {
37    pub fn get_subject_id(&self) -> DigestIdentifier {
38        match self {
39            Self::Create { subject_id, .. } => subject_id.clone(),
40            Self::Event { metadata, .. } => metadata.subject_id.clone(),
41        }
42    }
43
44    pub const fn is_valid(&self) -> bool {
45        match self {
46            Self::Create { event_request, .. } => {
47                matches!(event_request.content(), EventRequest::Create(..))
48            }
49            Self::Event { event_request, .. } => {
50                !matches!(event_request.content(), EventRequest::Create(..))
51            }
52        }
53    }
54
55    pub fn get_signed_event_request(&self) -> Signed<EventRequest> {
56        match self {
57            Self::Create { event_request, .. } => event_request.clone(),
58            Self::Event { event_request, .. } => event_request.clone(),
59        }
60    }
61
62    pub fn get_governance_id(&self) -> Result<DigestIdentifier, String> {
63        match self {
64            Self::Create { event_request, .. } => {
65                if let EventRequest::Create(create) = &event_request.content() {
66                    Ok(create.governance_id.clone())
67                } else {
68                    Err(format!(
69                        "Invalid event request: {}",
70                        EventRequestType::from(event_request.content())
71                    ))
72                }
73            }
74            Self::Event { metadata, .. } => Ok(metadata.governance_id.clone()),
75        }
76    }
77
78    pub const fn get_gov_version(&self) -> u64 {
79        match self {
80            Self::Create { gov_version, .. } => *gov_version,
81            Self::Event { gov_version, .. } => *gov_version,
82        }
83    }
84
85    pub const fn get_sn(&self) -> u64 {
86        match self {
87            Self::Create { .. } => 0,
88            Self::Event { sn, .. } => *sn,
89        }
90    }
91
92    pub fn get_schema_id(&self) -> Result<SchemaType, String> {
93        match self {
94            Self::Create { event_request, .. } => {
95                if let EventRequest::Create(create) = &event_request.content() {
96                    Ok(create.schema_id.clone())
97                } else {
98                    Err(format!(
99                        "Invalid event request: {}",
100                        EventRequestType::from(event_request.content())
101                    ))
102                }
103            }
104            Self::Event { metadata, .. } => Ok(metadata.schema_id.clone()),
105        }
106    }
107
108    pub fn get_namespace(&self) -> Result<Namespace, String> {
109        match self {
110            Self::Create { event_request, .. } => {
111                if let EventRequest::Create(create) = &event_request.content() {
112                    Ok(create.namespace.clone())
113                } else {
114                    Err(format!(
115                        "Invalid event request: {}",
116                        EventRequestType::from(event_request.content())
117                    ))
118                }
119            }
120            Self::Event { metadata, .. } => Ok(metadata.namespace.clone()),
121        }
122    }
123}
124
125#[derive(
126    Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize,
127)]
128pub struct LastData {
129    pub vali_data: ValidationData,
130    pub gov_version: u64,
131}
132
133#[derive(
134    Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize,
135)]
136pub enum ActualProtocols {
137    None,
138    Eval {
139        eval_data: EvaluationData,
140    },
141    EvalApprove {
142        eval_data: EvaluationData,
143        approval_data: ApprovalData,
144    },
145}
146
147impl ActualProtocols {
148    pub const fn is_success(&self) -> bool {
149        match &self {
150            Self::None => true,
151            Self::Eval { eval_data } => eval_data.is_ok(),
152            Self::EvalApprove { approval_data, .. } => approval_data.approved,
153        }
154    }
155
156    pub const fn check_protocols(
157        &self,
158        is_gov: bool,
159        event_request_type: &EventRequestType,
160    ) -> bool {
161        match (&self, is_gov, event_request_type) {
162            (Self::None, true, EventRequestType::Create)
163            | (Self::None, false, EventRequestType::Create)
164            | (Self::Eval { .. }, false, EventRequestType::Fact)
165            | (Self::Eval { .. }, true, EventRequestType::Transfer)
166            | (Self::Eval { .. }, false, EventRequestType::Transfer)
167            | (Self::Eval { .. }, true, EventRequestType::Confirm)
168            | (Self::None, false, EventRequestType::Confirm)
169            | (Self::None, true, EventRequestType::Reject)
170            | (Self::None, false, EventRequestType::Reject)
171            | (Self::None, true, EventRequestType::Eol)
172            | (Self::None, false, EventRequestType::Eol) => true,
173            (Self::Eval { eval_data }, true, EventRequestType::Fact) => {
174                !eval_data.is_ok()
175            }
176            (
177                Self::EvalApprove { eval_data, .. },
178                true,
179                EventRequestType::Fact,
180            ) => eval_data.is_ok(),
181            _ => false,
182        }
183    }
184}