xrpl/models/transactions/
oracle_delete.rs1use alloc::borrow::Cow;
2use alloc::vec::Vec;
3use serde::{Deserialize, Serialize};
4use serde_with::skip_serializing_none;
5
6use crate::models::amount::XRPAmount;
7use crate::models::transactions::{Memo, Signer, Transaction, TransactionType};
8use crate::models::{FlagCollection, Model, NoFlags, XRPLModelResult};
9
10use super::{CommonFields, CommonTransactionBuilder};
11
12#[skip_serializing_none]
17#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)]
18#[serde(rename_all = "PascalCase")]
19pub struct OracleDelete<'a> {
20 #[serde(flatten)]
25 pub common_fields: CommonFields<'a, NoFlags>,
26 #[serde(rename = "OracleDocumentID")]
28 pub oracle_document_id: u32,
29}
30
31impl Model for OracleDelete<'_> {
32 fn get_errors(&self) -> XRPLModelResult<()> {
33 Ok(())
34 }
35}
36
37impl<'a> Transaction<'a, NoFlags> for OracleDelete<'a> {
38 fn get_transaction_type(&self) -> &TransactionType {
39 self.common_fields.get_transaction_type()
40 }
41
42 fn get_common_fields(&self) -> &CommonFields<'_, NoFlags> {
43 self.common_fields.get_common_fields()
44 }
45
46 fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
47 self.common_fields.get_mut_common_fields()
48 }
49}
50
51impl<'a> CommonTransactionBuilder<'a, NoFlags> for OracleDelete<'a> {
52 fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
53 &mut self.common_fields
54 }
55
56 fn into_self(self) -> Self {
57 self
58 }
59}
60
61impl<'a> OracleDelete<'a> {
62 pub fn new(
63 account: Cow<'a, str>,
64 account_txn_id: Option<Cow<'a, str>>,
65 fee: Option<XRPAmount<'a>>,
66 last_ledger_sequence: Option<u32>,
67 memos: Option<Vec<Memo>>,
68 sequence: Option<u32>,
69 signers: Option<Vec<Signer>>,
70 source_tag: Option<u32>,
71 ticket_sequence: Option<u32>,
72 oracle_document_id: u32,
73 ) -> Self {
74 Self {
75 common_fields: CommonFields {
76 account,
77 transaction_type: TransactionType::OracleDelete,
78 account_txn_id,
79 fee,
80 flags: FlagCollection::default(),
81 last_ledger_sequence,
82 memos,
83 network_id: None,
84 sequence,
85 signers,
86 signing_pub_key: None, source_tag,
88 ticket_sequence,
89 txn_signature: None, },
91 oracle_document_id,
92 }
93 }
94}
95
96#[cfg(test)]
97mod tests {
98 use super::*;
99
100 const TEST_ACCOUNT: &str = "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW";
102 const TEST_FEE: &str = "12";
103 const TEST_SEQUENCE: u32 = 391;
104 const TEST_LAST_LEDGER: u32 = 596447;
105 const TEST_DOC_ID: u32 = 1;
106
107 #[test]
108 fn test_serde() {
109 let oracle_delete = OracleDelete {
110 common_fields: CommonFields {
111 account: TEST_ACCOUNT.into(),
112 transaction_type: TransactionType::OracleDelete,
113 fee: Some(TEST_FEE.into()),
114 sequence: Some(TEST_SEQUENCE),
115 signing_pub_key: Some("".into()),
116 ..Default::default()
117 },
118 oracle_document_id: TEST_DOC_ID,
119 };
120
121 let default_json_str = r#"{"Account":"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW","TransactionType":"OracleDelete","Fee":"12","Flags":0,"Sequence":391,"SigningPubKey":"","OracleDocumentID":1}"#;
122
123 let serialized_string = serde_json::to_string(&oracle_delete)
124 .expect("OracleDelete should serialize to JSON without error");
125 let serialized_value = serde_json::to_value(&serialized_string)
126 .expect("serialized OracleDelete string should be valid JSON");
127 let default_json_value =
128 serde_json::to_value(default_json_str).expect("expected JSON string is valid JSON");
129 assert_eq!(serialized_value, default_json_value);
130
131 let deserialized: OracleDelete = serde_json::from_str(default_json_str)
132 .expect("OracleDelete should deserialize from expected JSON");
133 assert_eq!(oracle_delete, deserialized);
134 }
135
136 #[test]
137 fn test_builder_pattern() {
138 let oracle_delete = OracleDelete {
139 common_fields: CommonFields {
140 account: TEST_ACCOUNT.into(),
141 transaction_type: TransactionType::OracleDelete,
142 ..Default::default()
143 },
144 oracle_document_id: TEST_DOC_ID,
145 }
146 .with_fee(TEST_FEE.into())
147 .with_sequence(TEST_SEQUENCE)
148 .with_last_ledger_sequence(TEST_LAST_LEDGER)
149 .with_source_tag(42)
150 .with_memo(Memo {
151 memo_data: Some("deleting oracle".into()),
152 memo_format: None,
153 memo_type: Some("text".into()),
154 });
155
156 assert_eq!(oracle_delete.oracle_document_id, TEST_DOC_ID);
157 assert_eq!(
158 oracle_delete.common_fields.fee.as_ref().unwrap().0,
159 TEST_FEE
160 );
161 assert_eq!(oracle_delete.common_fields.sequence, Some(TEST_SEQUENCE));
162 assert_eq!(
163 oracle_delete.common_fields.last_ledger_sequence,
164 Some(TEST_LAST_LEDGER)
165 );
166 assert_eq!(oracle_delete.common_fields.source_tag, Some(42));
167 assert_eq!(oracle_delete.common_fields.memos.as_ref().unwrap().len(), 1);
168 }
169
170 #[test]
171 fn test_default() {
172 let oracle_delete = OracleDelete {
173 common_fields: CommonFields {
174 account: TEST_ACCOUNT.into(),
175 transaction_type: TransactionType::OracleDelete,
176 ..Default::default()
177 },
178 oracle_document_id: 5,
179 };
180
181 assert_eq!(oracle_delete.common_fields.account, TEST_ACCOUNT);
182 assert_eq!(
183 oracle_delete.common_fields.transaction_type,
184 TransactionType::OracleDelete
185 );
186 assert_eq!(oracle_delete.oracle_document_id, 5);
187 assert!(oracle_delete.common_fields.fee.is_none());
188 assert!(oracle_delete.common_fields.sequence.is_none());
189 }
190
191 #[test]
192 fn test_new_constructor() {
193 let oracle_delete = OracleDelete {
194 common_fields: CommonFields {
195 account: TEST_ACCOUNT.into(),
196 transaction_type: TransactionType::OracleDelete,
197 fee: Some(TEST_FEE.into()),
198 last_ledger_sequence: Some(TEST_LAST_LEDGER),
199 sequence: Some(TEST_SEQUENCE),
200 ..Default::default()
201 },
202 oracle_document_id: TEST_DOC_ID,
203 };
204
205 assert_eq!(
206 oracle_delete.common_fields.transaction_type,
207 TransactionType::OracleDelete
208 );
209 assert_eq!(oracle_delete.common_fields.fee, Some(TEST_FEE.into()));
210 assert_eq!(oracle_delete.common_fields.sequence, Some(TEST_SEQUENCE));
211 assert_eq!(
212 oracle_delete.common_fields.last_ledger_sequence,
213 Some(TEST_LAST_LEDGER)
214 );
215 assert_eq!(oracle_delete.oracle_document_id, TEST_DOC_ID);
216 }
217
218 #[test]
219 fn test_transaction_type() {
220 let oracle_delete = OracleDelete {
221 common_fields: CommonFields {
222 account: TEST_ACCOUNT.into(),
223 transaction_type: TransactionType::OracleDelete,
224 ..Default::default()
225 },
226 oracle_document_id: 0,
227 };
228
229 assert_eq!(
230 *oracle_delete.get_transaction_type(),
231 TransactionType::OracleDelete
232 );
233 }
234
235 #[test]
236 fn test_ticket_sequence() {
237 let oracle_delete = OracleDelete {
238 common_fields: CommonFields {
239 account: TEST_ACCOUNT.into(),
240 transaction_type: TransactionType::OracleDelete,
241 ..Default::default()
242 },
243 oracle_document_id: 3,
244 }
245 .with_ticket_sequence(54321)
246 .with_fee(TEST_FEE.into());
247
248 assert_eq!(oracle_delete.common_fields.ticket_sequence, Some(54321));
249 assert!(oracle_delete.common_fields.sequence.is_none());
250 }
251
252 #[test]
253 fn test_zero_document_id() {
254 let oracle_delete = OracleDelete {
255 common_fields: CommonFields {
256 account: TEST_ACCOUNT.into(),
257 transaction_type: TransactionType::OracleDelete,
258 ..Default::default()
259 },
260 oracle_document_id: 0,
261 };
262
263 assert_eq!(oracle_delete.oracle_document_id, 0);
264 }
265
266 #[test]
267 fn test_max_document_id() {
268 let oracle_delete = OracleDelete {
269 common_fields: CommonFields {
270 account: TEST_ACCOUNT.into(),
271 transaction_type: TransactionType::OracleDelete,
272 ..Default::default()
273 },
274 oracle_document_id: u32::MAX,
275 };
276
277 assert_eq!(oracle_delete.oracle_document_id, u32::MAX);
278 }
279}