taple_core/commons/models/
request.rs1use borsh::{BorshDeserialize, BorshSerialize};
4use serde::{Deserialize, Serialize};
5
6use crate::{
7 commons::errors::SubjectError,
8 signature::{Signature, Signed},
9 DigestIdentifier, KeyIdentifier, ValueWrapper, DigestDerivator,
10};
11
12use super::HashId;
13
14#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
16pub enum EventRequest {
17 Create(StartRequest),
19 Fact(FactRequest),
21 Transfer(TransferRequest),
23 EOL(EOLRequest),
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
29pub struct StartRequest {
30 pub governance_id: DigestIdentifier,
32 pub schema_id: String,
34 pub namespace: String,
36 pub name: String,
38 pub public_key: KeyIdentifier,
40}
41
42#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
44pub struct FactRequest {
45 pub subject_id: DigestIdentifier,
47 pub payload: ValueWrapper,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
53pub struct TransferRequest {
54 pub subject_id: DigestIdentifier,
56 pub public_key: KeyIdentifier,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
62pub struct EOLRequest {
63 pub subject_id: DigestIdentifier,
65}
66
67impl EventRequest {
68 pub fn requires_eval_appr(&self) -> bool {
69 match self {
70 EventRequest::Fact(_) => true,
71 EventRequest::Create(_) | EventRequest::Transfer(_) | EventRequest::EOL(_) => false,
72 }
73 }
74}
75
76impl HashId for EventRequest {
77 fn hash_id(&self, derivator: DigestDerivator) -> Result<DigestIdentifier, SubjectError> {
78 DigestIdentifier::from_serializable_borsh(&self, derivator).map_err(|_| {
79 SubjectError::SignatureCreationFails("HashId for EventRequest Fails".to_string())
80 })
81 }
82}
83
84impl Signed<EventRequest> {
85 pub fn new(request: EventRequest, signature: Signature) -> Self {
86 Self {
87 content: request,
88 signature,
89 }
90 }
91
92 pub fn verify(&self) -> Result<(), SubjectError> {
93 self.signature.verify(&self.content)
94 }
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, BorshSerialize, BorshDeserialize)]
99pub enum RequestState {
100 Finished,
101 Error,
102 Processing,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, BorshSerialize, BorshDeserialize)]
107pub struct TapleRequest {
108 pub id: DigestIdentifier,
110 pub subject_id: Option<DigestIdentifier>,
112 pub sn: Option<u64>,
114 pub event_request: Signed<EventRequest>,
116 pub state: RequestState,
118 pub success: Option<bool>,
120}
121
122impl TryFrom<Signed<EventRequest>> for TapleRequest {
123 type Error = SubjectError;
124
125 fn try_from(event_request: Signed<EventRequest>) -> Result<Self, Self::Error> {
126 let id = DigestIdentifier::generate_with_blake3(&event_request)
127 .map_err(|_| SubjectError::CryptoError("Error generation request hash".to_owned()))?;
128 let subject_id = match &event_request.content {
129 crate::EventRequest::Create(_) => None,
130 crate::EventRequest::Fact(fact_request) => Some(fact_request.subject_id.clone()),
131 crate::EventRequest::Transfer(transfer_res) => Some(transfer_res.subject_id.clone()),
132 crate::EventRequest::EOL(eol_request) => Some(eol_request.subject_id.clone()),
133 };
134 Ok(Self {
135 id,
136 subject_id,
137 sn: None,
138 event_request,
139 state: RequestState::Processing,
140 success: None,
141 })
142 }
143}