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#[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}