xrpl/models/requests/
mod.rs

1pub mod account_channels;
2pub mod account_currencies;
3pub mod account_info;
4pub mod account_lines;
5pub mod account_nfts;
6pub mod account_objects;
7pub mod account_offers;
8pub mod account_tx;
9pub mod amm_info;
10pub mod book_offers;
11pub mod channel_authorize;
12pub mod channel_verify;
13pub mod deposit_authorize;
14pub mod fee;
15pub mod gateway_balances;
16pub mod ledger;
17pub mod ledger_closed;
18pub mod ledger_current;
19pub mod ledger_data;
20pub mod ledger_entry;
21pub mod manifest;
22pub mod nft_buy_offers;
23pub mod nft_history;
24pub mod nft_info;
25pub mod nft_sell_offers;
26pub mod nfts_by_issuer;
27pub mod no_ripple_check;
28pub mod path_find;
29pub mod ping;
30pub mod random;
31pub mod ripple_path_find;
32pub mod server_info;
33pub mod server_state;
34pub mod submit;
35pub mod submit_multisigned;
36pub mod subscribe;
37pub mod transaction_entry;
38pub mod tx;
39pub mod unsubscribe;
40
41use alloc::{borrow::Cow, string::String};
42use derive_new::new;
43use serde::{Deserialize, Serialize};
44use serde_with::skip_serializing_none;
45use strum_macros::Display;
46
47/// Represents the different options for the `method`
48/// field in a request.
49#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize, Display)]
50#[strum(serialize_all = "snake_case")]
51#[serde(rename_all = "snake_case")]
52pub enum RequestMethod {
53    // Account methods
54    AccountChannels,
55    AccountCurrencies,
56    AccountInfo,
57    AccountLines,
58    AccountNfts,
59    AccountObjects,
60    AccountOffers,
61    AccountTx,
62    #[serde(rename = "amm_info")]
63    AMMInfo,
64    GatewayBalances,
65    NoRippleCheck,
66
67    // Transaction methods
68    Sign,
69    SignFor,
70    Submit,
71    SubmitMultisigned,
72    TransactionEntry,
73    Tx,
74
75    // Channel methods
76    ChannelAuthorize,
77    ChannelVerify,
78
79    // Path methods
80    BookOffers,
81    DepositAuthorized,
82    #[serde(rename = "nft_buy_offers")]
83    NFTBuyOffers,
84    #[serde(rename = "nft_history")]
85    NFTHistory,
86    #[serde(rename = "nft_info")]
87    NFTInfo,
88    #[serde(rename = "nft_sell_offers")]
89    NFTSellOffers,
90    #[serde(rename = "nfts_by_issuer")]
91    NFTsByIssuer,
92    PathFind,
93    RipplePathFind,
94
95    // Ledger methods
96    Ledger,
97    LedgerClosed,
98    LedgerCurrent,
99    LedgerData,
100    LedgerEntry,
101
102    // Subscription methods
103    Subscribe,
104    Unsubscribe,
105
106    // Server info methods
107    Fee,
108    Manifest,
109    ServerInfo,
110    ServerState,
111
112    // Utility methods
113    Ping,
114    Random,
115}
116
117#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
118#[serde(untagged)]
119pub enum XRPLRequest<'a> {
120    AccountChannels(account_channels::AccountChannels<'a>),
121    AccountCurrencies(account_currencies::AccountCurrencies<'a>),
122    AccountInfo(account_info::AccountInfo<'a>),
123    AccountLines(account_lines::AccountLines<'a>),
124    AccountNfts(account_nfts::AccountNfts<'a>),
125    AccountObjects(account_objects::AccountObjects<'a>),
126    AccountOffers(account_offers::AccountOffers<'a>),
127    AccountTx(account_tx::AccountTx<'a>),
128    AMMInfo(amm_info::AMMInfo<'a>),
129    GatewayBalances(gateway_balances::GatewayBalances<'a>),
130    NoRippleCheck(no_ripple_check::NoRippleCheck<'a>),
131    Submit(submit::Submit<'a>),
132    SubmitMultisigned(submit_multisigned::SubmitMultisigned<'a>),
133    TransactionEntry(transaction_entry::TransactionEntry<'a>),
134    Tx(tx::Tx<'a>),
135    ChannelAuthorize(channel_authorize::ChannelAuthorize<'a>),
136    ChannelVerify(channel_verify::ChannelVerify<'a>),
137    BookOffers(book_offers::BookOffers<'a>),
138    DepositAuthorized(deposit_authorize::DepositAuthorized<'a>),
139    NFTBuyOffers(nft_buy_offers::NftBuyOffers<'a>),
140    NFTHistory(nft_history::NFTHistory<'a>),
141    NFTInfo(nft_info::NFTInfo<'a>),
142    NFTSellOffers(nft_sell_offers::NftSellOffers<'a>),
143    NFTsByIssuer(nfts_by_issuer::NFTsByIssuer<'a>),
144    PathFind(path_find::PathFind<'a>),
145    RipplePathFind(ripple_path_find::RipplePathFind<'a>),
146    Ledger(ledger::Ledger<'a>),
147    LedgerClosed(ledger_closed::LedgerClosed<'a>),
148    LedgerCurrent(ledger_current::LedgerCurrent<'a>),
149    LedgerData(ledger_data::LedgerData<'a>),
150    LedgerEntry(ledger_entry::LedgerEntry<'a>),
151    Subscribe(subscribe::Subscribe<'a>),
152    Unsubscribe(unsubscribe::Unsubscribe<'a>),
153    Fee(fee::Fee<'a>),
154    Manifest(manifest::Manifest<'a>),
155    ServerInfo(server_info::ServerInfo<'a>),
156    ServerState(server_state::ServerState<'a>),
157    Ping(ping::Ping<'a>),
158    Random(random::Random<'a>),
159}
160
161impl<'a> From<account_channels::AccountChannels<'a>> for XRPLRequest<'a> {
162    fn from(request: account_channels::AccountChannels<'a>) -> Self {
163        XRPLRequest::AccountChannels(request)
164    }
165}
166
167impl<'a> From<account_currencies::AccountCurrencies<'a>> for XRPLRequest<'a> {
168    fn from(request: account_currencies::AccountCurrencies<'a>) -> Self {
169        XRPLRequest::AccountCurrencies(request)
170    }
171}
172
173impl<'a> From<account_info::AccountInfo<'a>> for XRPLRequest<'a> {
174    fn from(request: account_info::AccountInfo<'a>) -> Self {
175        XRPLRequest::AccountInfo(request)
176    }
177}
178
179impl<'a> From<account_lines::AccountLines<'a>> for XRPLRequest<'a> {
180    fn from(request: account_lines::AccountLines<'a>) -> Self {
181        XRPLRequest::AccountLines(request)
182    }
183}
184
185impl<'a> From<account_nfts::AccountNfts<'a>> for XRPLRequest<'a> {
186    fn from(request: account_nfts::AccountNfts<'a>) -> Self {
187        XRPLRequest::AccountNfts(request)
188    }
189}
190
191impl<'a> From<account_objects::AccountObjects<'a>> for XRPLRequest<'a> {
192    fn from(request: account_objects::AccountObjects<'a>) -> Self {
193        XRPLRequest::AccountObjects(request)
194    }
195}
196
197impl<'a> From<account_offers::AccountOffers<'a>> for XRPLRequest<'a> {
198    fn from(request: account_offers::AccountOffers<'a>) -> Self {
199        XRPLRequest::AccountOffers(request)
200    }
201}
202
203impl<'a> From<account_tx::AccountTx<'a>> for XRPLRequest<'a> {
204    fn from(request: account_tx::AccountTx<'a>) -> Self {
205        XRPLRequest::AccountTx(request)
206    }
207}
208
209impl<'a> From<amm_info::AMMInfo<'a>> for XRPLRequest<'a> {
210    fn from(request: amm_info::AMMInfo<'a>) -> Self {
211        XRPLRequest::AMMInfo(request)
212    }
213}
214
215impl<'a> From<gateway_balances::GatewayBalances<'a>> for XRPLRequest<'a> {
216    fn from(request: gateway_balances::GatewayBalances<'a>) -> Self {
217        XRPLRequest::GatewayBalances(request)
218    }
219}
220
221impl<'a> From<no_ripple_check::NoRippleCheck<'a>> for XRPLRequest<'a> {
222    fn from(request: no_ripple_check::NoRippleCheck<'a>) -> Self {
223        XRPLRequest::NoRippleCheck(request)
224    }
225}
226
227impl<'a> From<submit::Submit<'a>> for XRPLRequest<'a> {
228    fn from(request: submit::Submit<'a>) -> Self {
229        XRPLRequest::Submit(request)
230    }
231}
232
233impl<'a> From<submit_multisigned::SubmitMultisigned<'a>> for XRPLRequest<'a> {
234    fn from(request: submit_multisigned::SubmitMultisigned<'a>) -> Self {
235        XRPLRequest::SubmitMultisigned(request)
236    }
237}
238
239impl<'a> From<transaction_entry::TransactionEntry<'a>> for XRPLRequest<'a> {
240    fn from(request: transaction_entry::TransactionEntry<'a>) -> Self {
241        XRPLRequest::TransactionEntry(request)
242    }
243}
244
245impl<'a> From<tx::Tx<'a>> for XRPLRequest<'a> {
246    fn from(request: tx::Tx<'a>) -> Self {
247        XRPLRequest::Tx(request)
248    }
249}
250
251impl<'a> From<channel_authorize::ChannelAuthorize<'a>> for XRPLRequest<'a> {
252    fn from(request: channel_authorize::ChannelAuthorize<'a>) -> Self {
253        XRPLRequest::ChannelAuthorize(request)
254    }
255}
256
257impl<'a> From<channel_verify::ChannelVerify<'a>> for XRPLRequest<'a> {
258    fn from(request: channel_verify::ChannelVerify<'a>) -> Self {
259        XRPLRequest::ChannelVerify(request)
260    }
261}
262
263impl<'a> From<book_offers::BookOffers<'a>> for XRPLRequest<'a> {
264    fn from(request: book_offers::BookOffers<'a>) -> Self {
265        XRPLRequest::BookOffers(request)
266    }
267}
268
269impl<'a> From<deposit_authorize::DepositAuthorized<'a>> for XRPLRequest<'a> {
270    fn from(request: deposit_authorize::DepositAuthorized<'a>) -> Self {
271        XRPLRequest::DepositAuthorized(request)
272    }
273}
274
275impl<'a> From<nft_buy_offers::NftBuyOffers<'a>> for XRPLRequest<'a> {
276    fn from(request: nft_buy_offers::NftBuyOffers<'a>) -> Self {
277        XRPLRequest::NFTBuyOffers(request)
278    }
279}
280
281impl<'a> From<nft_sell_offers::NftSellOffers<'a>> for XRPLRequest<'a> {
282    fn from(request: nft_sell_offers::NftSellOffers<'a>) -> Self {
283        XRPLRequest::NFTSellOffers(request)
284    }
285}
286
287impl<'a> From<path_find::PathFind<'a>> for XRPLRequest<'a> {
288    fn from(request: path_find::PathFind<'a>) -> Self {
289        XRPLRequest::PathFind(request)
290    }
291}
292
293impl<'a> From<ripple_path_find::RipplePathFind<'a>> for XRPLRequest<'a> {
294    fn from(request: ripple_path_find::RipplePathFind<'a>) -> Self {
295        XRPLRequest::RipplePathFind(request)
296    }
297}
298
299impl<'a> From<ledger::Ledger<'a>> for XRPLRequest<'a> {
300    fn from(request: ledger::Ledger<'a>) -> Self {
301        XRPLRequest::Ledger(request)
302    }
303}
304
305impl<'a> From<ledger_closed::LedgerClosed<'a>> for XRPLRequest<'a> {
306    fn from(request: ledger_closed::LedgerClosed<'a>) -> Self {
307        XRPLRequest::LedgerClosed(request)
308    }
309}
310
311impl<'a> From<ledger_current::LedgerCurrent<'a>> for XRPLRequest<'a> {
312    fn from(request: ledger_current::LedgerCurrent<'a>) -> Self {
313        XRPLRequest::LedgerCurrent(request)
314    }
315}
316
317impl<'a> From<ledger_data::LedgerData<'a>> for XRPLRequest<'a> {
318    fn from(request: ledger_data::LedgerData<'a>) -> Self {
319        XRPLRequest::LedgerData(request)
320    }
321}
322
323impl<'a> From<ledger_entry::LedgerEntry<'a>> for XRPLRequest<'a> {
324    fn from(request: ledger_entry::LedgerEntry<'a>) -> Self {
325        XRPLRequest::LedgerEntry(request)
326    }
327}
328
329impl<'a> From<subscribe::Subscribe<'a>> for XRPLRequest<'a> {
330    fn from(request: subscribe::Subscribe<'a>) -> Self {
331        XRPLRequest::Subscribe(request)
332    }
333}
334
335impl<'a> From<unsubscribe::Unsubscribe<'a>> for XRPLRequest<'a> {
336    fn from(request: unsubscribe::Unsubscribe<'a>) -> Self {
337        XRPLRequest::Unsubscribe(request)
338    }
339}
340
341impl<'a> From<fee::Fee<'a>> for XRPLRequest<'a> {
342    fn from(request: fee::Fee<'a>) -> Self {
343        XRPLRequest::Fee(request)
344    }
345}
346
347impl<'a> From<manifest::Manifest<'a>> for XRPLRequest<'a> {
348    fn from(request: manifest::Manifest<'a>) -> Self {
349        XRPLRequest::Manifest(request)
350    }
351}
352
353impl<'a> From<server_info::ServerInfo<'a>> for XRPLRequest<'a> {
354    fn from(request: server_info::ServerInfo<'a>) -> Self {
355        XRPLRequest::ServerInfo(request)
356    }
357}
358
359impl<'a> From<server_state::ServerState<'a>> for XRPLRequest<'a> {
360    fn from(request: server_state::ServerState<'a>) -> Self {
361        XRPLRequest::ServerState(request)
362    }
363}
364
365impl<'a> From<ping::Ping<'a>> for XRPLRequest<'a> {
366    fn from(request: ping::Ping<'a>) -> Self {
367        XRPLRequest::Ping(request)
368    }
369}
370
371impl<'a> From<random::Random<'a>> for XRPLRequest<'a> {
372    fn from(request: random::Random<'a>) -> Self {
373        XRPLRequest::Random(request)
374    }
375}
376
377impl<'a> Request<'a> for XRPLRequest<'a> {
378    fn get_common_fields(&self) -> &CommonFields<'a> {
379        match self {
380            XRPLRequest::AccountChannels(request) => request.get_common_fields(),
381            XRPLRequest::AccountCurrencies(request) => request.get_common_fields(),
382            XRPLRequest::AccountInfo(request) => request.get_common_fields(),
383            XRPLRequest::AccountLines(request) => request.get_common_fields(),
384            XRPLRequest::AccountNfts(request) => request.get_common_fields(),
385            XRPLRequest::AccountObjects(request) => request.get_common_fields(),
386            XRPLRequest::AccountOffers(request) => request.get_common_fields(),
387            XRPLRequest::AccountTx(request) => request.get_common_fields(),
388            XRPLRequest::AMMInfo(request) => request.get_common_fields(),
389            XRPLRequest::GatewayBalances(request) => request.get_common_fields(),
390            XRPLRequest::NoRippleCheck(request) => request.get_common_fields(),
391            XRPLRequest::Submit(request) => request.get_common_fields(),
392            XRPLRequest::SubmitMultisigned(request) => request.get_common_fields(),
393            XRPLRequest::TransactionEntry(request) => request.get_common_fields(),
394            XRPLRequest::Tx(request) => request.get_common_fields(),
395            XRPLRequest::ChannelAuthorize(request) => request.get_common_fields(),
396            XRPLRequest::ChannelVerify(request) => request.get_common_fields(),
397            XRPLRequest::BookOffers(request) => request.get_common_fields(),
398            XRPLRequest::DepositAuthorized(request) => request.get_common_fields(),
399            XRPLRequest::NFTBuyOffers(request) => request.get_common_fields(),
400            XRPLRequest::NFTHistory(request) => request.get_common_fields(),
401            XRPLRequest::NFTInfo(request) => request.get_common_fields(),
402            XRPLRequest::NFTSellOffers(request) => request.get_common_fields(),
403            XRPLRequest::NFTsByIssuer(request) => request.get_common_fields(),
404            XRPLRequest::PathFind(request) => request.get_common_fields(),
405            XRPLRequest::RipplePathFind(request) => request.get_common_fields(),
406            XRPLRequest::Ledger(request) => request.get_common_fields(),
407            XRPLRequest::LedgerClosed(request) => request.get_common_fields(),
408            XRPLRequest::LedgerCurrent(request) => request.get_common_fields(),
409            XRPLRequest::LedgerData(request) => request.get_common_fields(),
410            XRPLRequest::LedgerEntry(request) => request.get_common_fields(),
411            XRPLRequest::Subscribe(request) => request.get_common_fields(),
412            XRPLRequest::Unsubscribe(request) => request.get_common_fields(),
413            XRPLRequest::Fee(request) => request.get_common_fields(),
414            XRPLRequest::Manifest(request) => request.get_common_fields(),
415            XRPLRequest::ServerInfo(request) => request.get_common_fields(),
416            XRPLRequest::ServerState(request) => request.get_common_fields(),
417            XRPLRequest::Ping(request) => request.get_common_fields(),
418            XRPLRequest::Random(request) => request.get_common_fields(),
419        }
420    }
421
422    fn get_common_fields_mut(&mut self) -> &mut CommonFields<'a> {
423        match self {
424            XRPLRequest::AccountChannels(request) => request.get_common_fields_mut(),
425            XRPLRequest::AccountCurrencies(request) => request.get_common_fields_mut(),
426            XRPLRequest::AccountInfo(request) => request.get_common_fields_mut(),
427            XRPLRequest::AccountLines(request) => request.get_common_fields_mut(),
428            XRPLRequest::AccountNfts(request) => request.get_common_fields_mut(),
429            XRPLRequest::AccountObjects(request) => request.get_common_fields_mut(),
430            XRPLRequest::AccountOffers(request) => request.get_common_fields_mut(),
431            XRPLRequest::AccountTx(request) => request.get_common_fields_mut(),
432            XRPLRequest::AMMInfo(request) => request.get_common_fields_mut(),
433            XRPLRequest::GatewayBalances(request) => request.get_common_fields_mut(),
434            XRPLRequest::NoRippleCheck(request) => request.get_common_fields_mut(),
435            XRPLRequest::Submit(request) => request.get_common_fields_mut(),
436            XRPLRequest::SubmitMultisigned(request) => request.get_common_fields_mut(),
437            XRPLRequest::TransactionEntry(request) => request.get_common_fields_mut(),
438            XRPLRequest::Tx(request) => request.get_common_fields_mut(),
439            XRPLRequest::ChannelAuthorize(request) => request.get_common_fields_mut(),
440            XRPLRequest::ChannelVerify(request) => request.get_common_fields_mut(),
441            XRPLRequest::BookOffers(request) => request.get_common_fields_mut(),
442            XRPLRequest::DepositAuthorized(request) => request.get_common_fields_mut(),
443            XRPLRequest::NFTBuyOffers(request) => request.get_common_fields_mut(),
444            XRPLRequest::NFTHistory(request) => request.get_common_fields_mut(),
445            XRPLRequest::NFTInfo(request) => request.get_common_fields_mut(),
446            XRPLRequest::NFTSellOffers(request) => request.get_common_fields_mut(),
447            XRPLRequest::NFTsByIssuer(request) => request.get_common_fields_mut(),
448            XRPLRequest::PathFind(request) => request.get_common_fields_mut(),
449            XRPLRequest::RipplePathFind(request) => request.get_common_fields_mut(),
450            XRPLRequest::Ledger(request) => request.get_common_fields_mut(),
451            XRPLRequest::LedgerClosed(request) => request.get_common_fields_mut(),
452            XRPLRequest::LedgerCurrent(request) => request.get_common_fields_mut(),
453            XRPLRequest::LedgerData(request) => request.get_common_fields_mut(),
454            XRPLRequest::LedgerEntry(request) => request.get_common_fields_mut(),
455            XRPLRequest::Subscribe(request) => request.get_common_fields_mut(),
456            XRPLRequest::Unsubscribe(request) => request.get_common_fields_mut(),
457            XRPLRequest::Fee(request) => request.get_common_fields_mut(),
458            XRPLRequest::Manifest(request) => request.get_common_fields_mut(),
459            XRPLRequest::ServerInfo(request) => request.get_common_fields_mut(),
460            XRPLRequest::ServerState(request) => request.get_common_fields_mut(),
461            XRPLRequest::Ping(request) => request.get_common_fields_mut(),
462            XRPLRequest::Random(request) => request.get_common_fields_mut(),
463        }
464    }
465}
466
467/// The base fields for all request models.
468#[skip_serializing_none]
469#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, new)]
470pub struct CommonFields<'a> {
471    /// The request method.
472    pub command: RequestMethod,
473    /// The unique request id.
474    pub id: Option<Cow<'a, str>>,
475}
476
477#[skip_serializing_none]
478#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, new)]
479pub struct LookupByLedgerRequest<'a> {
480    /// A 20-byte hex string for the ledger version to use.
481    pub ledger_hash: Option<Cow<'a, str>>,
482    /// The ledger index of the ledger to use, or a shortcut
483    /// string to choose a ledger automatically.
484    pub ledger_index: Option<LedgerIndex<'a>>,
485}
486
487#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
488pub struct LedgerSequenceMarker {
489    ledger: u32,
490    seq: u32,
491}
492
493#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
494#[serde(untagged)]
495pub enum Marker<'a> {
496    Int(u32),
497    Str(Cow<'a, str>),
498    Sequence(LedgerSequenceMarker),
499}
500
501impl From<u32> for Marker<'_> {
502    fn from(value: u32) -> Self {
503        Marker::Int(value)
504    }
505}
506
507impl<'a> From<&'a str> for Marker<'a> {
508    fn from(value: &'a str) -> Self {
509        Marker::Str(Cow::Borrowed(value))
510    }
511}
512
513impl<'a> From<Cow<'a, str>> for Marker<'a> {
514    fn from(value: Cow<'a, str>) -> Self {
515        Marker::Str(value)
516    }
517}
518
519impl From<String> for Marker<'_> {
520    fn from(value: String) -> Self {
521        Marker::Str(Cow::Owned(value))
522    }
523}
524
525#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
526#[serde(untagged)]
527pub enum LedgerIndex<'a> {
528    Int(u32),
529    Str(Cow<'a, str>),
530}
531
532impl From<u32> for LedgerIndex<'_> {
533    fn from(value: u32) -> Self {
534        LedgerIndex::Int(value)
535    }
536}
537
538impl<'a> From<&'a str> for LedgerIndex<'a> {
539    fn from(value: &'a str) -> Self {
540        LedgerIndex::Str(Cow::Borrowed(value))
541    }
542}
543
544impl<'a> From<Cow<'a, str>> for LedgerIndex<'a> {
545    fn from(value: Cow<'a, str>) -> Self {
546        LedgerIndex::Str(value)
547    }
548}
549
550impl From<String> for LedgerIndex<'_> {
551    fn from(value: String) -> Self {
552        LedgerIndex::Str(Cow::Owned(value))
553    }
554}
555
556/// The base trait for all request models.
557/// Used to identify the model as a request.
558pub trait Request<'a> {
559    fn get_common_fields(&self) -> &CommonFields<'a>;
560    fn get_common_fields_mut(&mut self) -> &mut CommonFields<'a>;
561}
562
563#[skip_serializing_none]
564#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
565#[serde(rename_all = "camelCase")]
566pub struct FundFaucet<'a> {
567    pub destination: Cow<'a, str>,
568    pub usage_context: Option<Cow<'a, str>>,
569    pub user_agent: Option<Cow<'a, str>>,
570}