soroban_cli/commands/tx/op/add/
mod.rs

1use 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}