Skip to main content

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