soroban_cli/commands/tx/op/add/
mod.rs1use super::super::{global, help, xdr::tx_envelope_from_input};
2use crate::xdr::{OperationBody, WriteXdr};
3
4pub(crate) use super::super::new;
5
6mod account_merge;
7mod args;
8mod bump_sequence;
9mod change_trust;
10mod create_account;
11mod manage_data;
12mod payment;
13mod set_options;
14mod set_trustline_flags;
15
16#[derive(Debug, clap::Parser)]
17#[allow(clippy::doc_markdown)]
18pub enum Cmd {
19 #[command(about = help::ACCOUNT_MERGE)]
20 AccountMerge(account_merge::Cmd),
21 #[command(about = help::BUMP_SEQUENCE)]
22 BumpSequence(bump_sequence::Cmd),
23 #[command(about = help::CHANGE_TRUST)]
24 ChangeTrust(change_trust::Cmd),
25 #[command(about = help::CREATE_ACCOUNT)]
26 CreateAccount(create_account::Cmd),
27 #[command(about = help::MANAGE_DATA)]
28 ManageData(manage_data::Cmd),
29 #[command(about = help::PAYMENT)]
30 Payment(payment::Cmd),
31 #[command(about = help::SET_OPTIONS)]
32 SetOptions(set_options::Cmd),
33 #[command(about = help::SET_TRUSTLINE_FLAGS)]
34 SetTrustlineFlags(set_trustline_flags::Cmd),
35}
36
37#[derive(thiserror::Error, Debug)]
38pub enum Error {
39 #[error(transparent)]
40 TxXdr(#[from] super::super::xdr::Error),
41 #[error(transparent)]
42 Xdr(#[from] crate::xdr::Error),
43 #[error(transparent)]
44 New(#[from] super::super::new::Error),
45 #[error(transparent)]
46 Tx(#[from] super::super::args::Error),
47}
48
49impl TryFrom<&Cmd> for OperationBody {
50 type Error = super::super::new::Error;
51 fn try_from(cmd: &Cmd) -> Result<Self, Self::Error> {
52 Ok(match &cmd {
53 Cmd::AccountMerge(account_merge::Cmd { op, .. }) => op.try_into()?,
54 Cmd::BumpSequence(bump_sequence::Cmd { op, .. }) => op.into(),
55 Cmd::ChangeTrust(change_trust::Cmd { op, .. }) => op.try_into()?,
56 Cmd::CreateAccount(create_account::Cmd { op, .. }) => op.try_into()?,
57 Cmd::ManageData(manage_data::Cmd { op, .. }) => op.into(),
58 Cmd::Payment(payment::Cmd { op, .. }) => op.try_into()?,
59 Cmd::SetOptions(set_options::Cmd { op, .. }) => op.try_into()?,
60 Cmd::SetTrustlineFlags(set_trustline_flags::Cmd { op, .. }) => op.try_into()?,
61 })
62 }
63}
64
65impl Cmd {
66 pub async fn run(&self, _: &global::Args) -> Result<(), Error> {
67 let op = OperationBody::try_from(self)?;
68 let res = match self {
69 Cmd::AccountMerge(cmd) => cmd.op.tx.add_op(
70 op,
71 tx_envelope_from_input(&cmd.args.tx_xdr)?,
72 cmd.args.source(),
73 ),
74 Cmd::BumpSequence(cmd) => cmd.op.tx.add_op(
75 op,
76 tx_envelope_from_input(&cmd.args.tx_xdr)?,
77 cmd.args.source(),
78 ),
79 Cmd::ChangeTrust(cmd) => cmd.op.tx.add_op(
80 op,
81 tx_envelope_from_input(&cmd.args.tx_xdr)?,
82 cmd.args.source(),
83 ),
84 Cmd::CreateAccount(cmd) => cmd.op.tx.add_op(
85 op,
86 tx_envelope_from_input(&cmd.args.tx_xdr)?,
87 cmd.args.source(),
88 ),
89 Cmd::ManageData(cmd) => cmd.op.tx.add_op(
90 op,
91 tx_envelope_from_input(&cmd.args.tx_xdr)?,
92 cmd.args.source(),
93 ),
94 Cmd::Payment(cmd) => cmd.op.tx.add_op(
95 op,
96 tx_envelope_from_input(&cmd.args.tx_xdr)?,
97 cmd.args.source(),
98 ),
99 Cmd::SetOptions(cmd) => cmd.op.tx.add_op(
100 op,
101 tx_envelope_from_input(&cmd.args.tx_xdr)?,
102 cmd.args.source(),
103 ),
104 Cmd::SetTrustlineFlags(cmd) => cmd.op.tx.add_op(
105 op,
106 tx_envelope_from_input(&cmd.args.tx_xdr)?,
107 cmd.args.source(),
108 ),
109 }
110 .await?;
111 println!("{}", res.to_xdr_base64(crate::xdr::Limits::none())?);
112 Ok(())
113 }
114}