soroban_cli/commands/tx/new/
path_payment_strict_receive.rs1use clap::Parser;
2
3use crate::{commands::tx, config::address, tx::builder, xdr};
4
5#[derive(Parser, Debug, Clone)]
6#[group(skip)]
7pub struct Cmd {
8 #[command(flatten)]
9 pub tx: tx::Args,
10 #[clap(flatten)]
11 pub op: Args,
12}
13
14#[derive(Debug, clap::Args, Clone)]
15pub struct Args {
16 #[arg(long)]
18 pub send_asset: builder::Asset,
19
20 #[arg(long)]
22 pub send_max: builder::Amount,
23
24 #[arg(long)]
26 pub destination: address::UnresolvedMuxedAccount,
27
28 #[arg(long)]
30 pub dest_asset: builder::Asset,
31
32 #[arg(long)]
34 pub dest_amount: builder::Amount,
35
36 #[arg(long, value_delimiter = ',')]
38 pub path: Vec<builder::Asset>,
39}
40
41impl TryFrom<&Cmd> for xdr::OperationBody {
42 type Error = tx::args::Error;
43 fn try_from(
44 Cmd {
45 tx,
46 op:
47 Args {
48 send_asset,
49 send_max,
50 destination,
51 dest_asset,
52 dest_amount,
53 path,
54 },
55 }: &Cmd,
56 ) -> Result<Self, Self::Error> {
57 if path.len() > 5 {
59 return Err(tx::args::Error::InvalidPath(
60 "Path cannot contain more than 5 assets".to_string(),
61 ));
62 }
63
64 let path_assets: Result<Vec<xdr::Asset>, _> =
65 path.iter().map(|asset| tx.resolve_asset(asset)).collect();
66 let path_assets = path_assets?;
67
68 let path_vec = path_assets.try_into().map_err(|_| {
69 tx::args::Error::InvalidPath("Failed to convert path to VecM".to_string())
70 })?;
71
72 Ok(xdr::OperationBody::PathPaymentStrictReceive(
73 xdr::PathPaymentStrictReceiveOp {
74 send_asset: tx.resolve_asset(send_asset)?,
75 send_max: send_max.into(),
76 destination: tx.resolve_muxed_address(destination)?,
77 dest_asset: tx.resolve_asset(dest_asset)?,
78 dest_amount: dest_amount.into(),
79 path: path_vec,
80 },
81 ))
82 }
83}