1use super::super::{global, help, xdr::tx_envelope_from_input};
2use crate::utils::XDR_DEPTH_LIMIT;
3use crate::xdr::{OperationBody, WriteXdr};
4
5pub(crate) use super::super::new;
6
7mod account_merge;
8mod args;
9mod begin_sponsoring_future_reserves;
10mod bump_sequence;
11mod change_trust;
12mod claim_claimable_balance;
13mod clawback;
14mod clawback_claimable_balance;
15mod create_account;
16mod create_claimable_balance;
17mod create_passive_sell_offer;
18mod end_sponsoring_future_reserves;
19mod liquidity_pool_deposit;
20mod liquidity_pool_withdraw;
21mod manage_buy_offer;
22mod manage_data;
23mod manage_sell_offer;
24mod path_payment_strict_receive;
25mod path_payment_strict_send;
26mod payment;
27mod revoke_sponsorship;
28mod set_options;
29mod set_trustline_flags;
30
31#[derive(Debug, clap::Parser)]
32#[allow(clippy::doc_markdown)]
33pub enum Cmd {
34 #[command(about = help::ACCOUNT_MERGE)]
35 AccountMerge(account_merge::Cmd),
36 #[command(about = help::BEGIN_SPONSORING_FUTURE_RESERVES)]
37 BeginSponsoringFutureReserves(begin_sponsoring_future_reserves::Cmd),
38 #[command(about = help::BUMP_SEQUENCE)]
39 BumpSequence(bump_sequence::Cmd),
40 #[command(about = help::CHANGE_TRUST)]
41 ChangeTrust(change_trust::Cmd),
42 #[command(about = help::CLAIM_CLAIMABLE_BALANCE)]
43 ClaimClaimableBalance(claim_claimable_balance::Cmd),
44 #[command(about = help::CLAWBACK)]
45 Clawback(clawback::Cmd),
46 #[command(about = help::CLAWBACK_CLAIMABLE_BALANCE)]
47 ClawbackClaimableBalance(clawback_claimable_balance::Cmd),
48 #[command(about = help::CREATE_ACCOUNT)]
49 CreateAccount(create_account::Cmd),
50 #[command(about = help::CREATE_CLAIMABLE_BALANCE)]
51 CreateClaimableBalance(create_claimable_balance::Cmd),
52 #[command(about = help::CREATE_PASSIVE_SELL_OFFER)]
53 CreatePassiveSellOffer(create_passive_sell_offer::Cmd),
54 #[command(about = help::END_SPONSORING_FUTURE_RESERVES)]
55 EndSponsoringFutureReserves(end_sponsoring_future_reserves::Cmd),
56 #[command(about = help::LIQUIDITY_POOL_DEPOSIT)]
57 LiquidityPoolDeposit(liquidity_pool_deposit::Cmd),
58 #[command(about = help::LIQUIDITY_POOL_WITHDRAW)]
59 LiquidityPoolWithdraw(liquidity_pool_withdraw::Cmd),
60 #[command(about = help::MANAGE_BUY_OFFER)]
61 ManageBuyOffer(manage_buy_offer::Cmd),
62 #[command(about = help::MANAGE_DATA)]
63 ManageData(manage_data::Cmd),
64 #[command(about = help::MANAGE_SELL_OFFER)]
65 ManageSellOffer(manage_sell_offer::Cmd),
66 #[command(about = help::PATH_PAYMENT_STRICT_RECEIVE)]
67 PathPaymentStrictReceive(path_payment_strict_receive::Cmd),
68 #[command(about = help::PATH_PAYMENT_STRICT_SEND)]
69 PathPaymentStrictSend(path_payment_strict_send::Cmd),
70 #[command(about = help::PAYMENT)]
71 Payment(payment::Cmd),
72 #[command(about = help::REVOKE_SPONSORSHIP)]
73 RevokeSponsorship(revoke_sponsorship::Cmd),
74 #[command(about = help::SET_OPTIONS)]
75 SetOptions(set_options::Cmd),
76 #[command(about = help::SET_TRUSTLINE_FLAGS)]
77 SetTrustlineFlags(set_trustline_flags::Cmd),
78}
79
80#[derive(thiserror::Error, Debug)]
81pub enum Error {
82 #[error(transparent)]
83 TxXdr(#[from] super::super::xdr::Error),
84 #[error(transparent)]
85 Xdr(#[from] crate::xdr::Error),
86 #[error(transparent)]
87 New(#[from] super::super::new::Error),
88 #[error(transparent)]
89 Tx(#[from] super::super::args::Error),
90}
91
92impl TryFrom<&Cmd> for OperationBody {
93 type Error = super::super::new::Error;
94 fn try_from(cmd: &Cmd) -> Result<Self, Self::Error> {
95 Ok(match &cmd {
96 Cmd::AccountMerge(account_merge::Cmd { op, .. }) => op.try_into()?,
97 Cmd::BeginSponsoringFutureReserves(begin_sponsoring_future_reserves::Cmd {
98 op,
99 ..
100 }) => op.try_into()?,
101 Cmd::BumpSequence(bump_sequence::Cmd { op, .. }) => op.into(),
102 Cmd::ChangeTrust(change_trust::Cmd { op, .. }) => op.try_into()?,
103 Cmd::ClaimClaimableBalance(claim_claimable_balance::Cmd { op, .. }) => op.try_into()?,
104 Cmd::Clawback(clawback::Cmd { op, .. }) => op.try_into()?,
105 Cmd::ClawbackClaimableBalance(clawback_claimable_balance::Cmd { op, .. }) => {
106 op.try_into()?
107 }
108 Cmd::CreateAccount(create_account::Cmd { op, .. }) => op.try_into()?,
109 Cmd::CreateClaimableBalance(create_claimable_balance::Cmd { op, .. }) => {
110 op.try_into()?
111 }
112 Cmd::CreatePassiveSellOffer(create_passive_sell_offer::Cmd { op, .. }) => {
113 op.try_into()?
114 }
115 Cmd::EndSponsoringFutureReserves(end_sponsoring_future_reserves::Cmd {
116 op, ..
117 }) => op.into(),
118 Cmd::LiquidityPoolDeposit(liquidity_pool_deposit::Cmd { op, .. }) => op.try_into()?,
119 Cmd::LiquidityPoolWithdraw(liquidity_pool_withdraw::Cmd { op, .. }) => op.try_into()?,
120 Cmd::ManageBuyOffer(manage_buy_offer::Cmd { op, .. }) => op.try_into()?,
121 Cmd::ManageData(manage_data::Cmd { op, .. }) => op.into(),
122 Cmd::ManageSellOffer(manage_sell_offer::Cmd { op, .. }) => op.try_into()?,
123 Cmd::PathPaymentStrictReceive(path_payment_strict_receive::Cmd { op, .. }) => {
124 op.try_into()?
125 }
126 Cmd::PathPaymentStrictSend(path_payment_strict_send::Cmd { op, .. }) => {
127 op.try_into()?
128 }
129 Cmd::Payment(payment::Cmd { op, .. }) => op.try_into()?,
130 Cmd::RevokeSponsorship(revoke_sponsorship::Cmd { op, .. }) => op.try_into()?,
131 Cmd::SetOptions(set_options::Cmd { op, .. }) => op.try_into()?,
132 Cmd::SetTrustlineFlags(set_trustline_flags::Cmd { op, .. }) => op.try_into()?,
133 })
134 }
135}
136
137impl Cmd {
138 #[allow(clippy::too_many_lines)]
139 pub fn run(&self, _: &global::Args) -> Result<(), Error> {
140 let op = OperationBody::try_from(self)?;
141 let res = match self {
142 Cmd::AccountMerge(cmd) => cmd.op.tx.add_op(
143 op,
144 tx_envelope_from_input(&cmd.args.tx_xdr)?,
145 cmd.args.source(),
146 ),
147 Cmd::BeginSponsoringFutureReserves(cmd) => cmd.op.tx.add_op(
148 op,
149 tx_envelope_from_input(&cmd.args.tx_xdr)?,
150 cmd.args.source(),
151 ),
152 Cmd::BumpSequence(cmd) => cmd.op.tx.add_op(
153 op,
154 tx_envelope_from_input(&cmd.args.tx_xdr)?,
155 cmd.args.source(),
156 ),
157 Cmd::ChangeTrust(cmd) => cmd.op.tx.add_op(
158 op,
159 tx_envelope_from_input(&cmd.args.tx_xdr)?,
160 cmd.args.source(),
161 ),
162 Cmd::ClaimClaimableBalance(cmd) => cmd.op.tx.add_op(
163 op,
164 tx_envelope_from_input(&cmd.args.tx_xdr)?,
165 cmd.args.source(),
166 ),
167 Cmd::Clawback(cmd) => cmd.op.tx.add_op(
168 op,
169 tx_envelope_from_input(&cmd.args.tx_xdr)?,
170 cmd.args.source(),
171 ),
172 Cmd::ClawbackClaimableBalance(cmd) => cmd.op.tx.add_op(
173 op,
174 tx_envelope_from_input(&cmd.args.tx_xdr)?,
175 cmd.args.source(),
176 ),
177 Cmd::CreateAccount(cmd) => cmd.op.tx.add_op(
178 op,
179 tx_envelope_from_input(&cmd.args.tx_xdr)?,
180 cmd.args.source(),
181 ),
182 Cmd::CreateClaimableBalance(cmd) => cmd.op.tx.add_op(
183 op,
184 tx_envelope_from_input(&cmd.args.tx_xdr)?,
185 cmd.args.source(),
186 ),
187 Cmd::CreatePassiveSellOffer(cmd) => cmd.op.tx.add_op(
188 op,
189 tx_envelope_from_input(&cmd.args.tx_xdr)?,
190 cmd.args.source(),
191 ),
192 Cmd::EndSponsoringFutureReserves(cmd) => cmd.op.tx.add_op(
193 op,
194 tx_envelope_from_input(&cmd.args.tx_xdr)?,
195 cmd.args.source(),
196 ),
197 Cmd::LiquidityPoolDeposit(cmd) => cmd.op.tx.add_op(
198 op,
199 tx_envelope_from_input(&cmd.args.tx_xdr)?,
200 cmd.args.source(),
201 ),
202 Cmd::LiquidityPoolWithdraw(cmd) => cmd.op.tx.add_op(
203 op,
204 tx_envelope_from_input(&cmd.args.tx_xdr)?,
205 cmd.args.source(),
206 ),
207 Cmd::ManageBuyOffer(cmd) => cmd.op.tx.add_op(
208 op,
209 tx_envelope_from_input(&cmd.args.tx_xdr)?,
210 cmd.args.source(),
211 ),
212 Cmd::ManageData(cmd) => cmd.op.tx.add_op(
213 op,
214 tx_envelope_from_input(&cmd.args.tx_xdr)?,
215 cmd.args.source(),
216 ),
217 Cmd::ManageSellOffer(cmd) => cmd.op.tx.add_op(
218 op,
219 tx_envelope_from_input(&cmd.args.tx_xdr)?,
220 cmd.args.source(),
221 ),
222 Cmd::PathPaymentStrictReceive(cmd) => cmd.op.tx.add_op(
223 op,
224 tx_envelope_from_input(&cmd.args.tx_xdr)?,
225 cmd.args.source(),
226 ),
227 Cmd::PathPaymentStrictSend(cmd) => cmd.op.tx.add_op(
228 op,
229 tx_envelope_from_input(&cmd.args.tx_xdr)?,
230 cmd.args.source(),
231 ),
232 Cmd::Payment(cmd) => cmd.op.tx.add_op(
233 op,
234 tx_envelope_from_input(&cmd.args.tx_xdr)?,
235 cmd.args.source(),
236 ),
237 Cmd::RevokeSponsorship(cmd) => cmd.op.tx.add_op(
238 op,
239 tx_envelope_from_input(&cmd.args.tx_xdr)?,
240 cmd.args.source(),
241 ),
242 Cmd::SetOptions(cmd) => cmd.op.tx.add_op(
243 op,
244 tx_envelope_from_input(&cmd.args.tx_xdr)?,
245 cmd.args.source(),
246 ),
247 Cmd::SetTrustlineFlags(cmd) => cmd.op.tx.add_op(
248 op,
249 tx_envelope_from_input(&cmd.args.tx_xdr)?,
250 cmd.args.source(),
251 ),
252 }?;
253 println!(
254 "{}",
255 res.to_xdr_base64(crate::xdr::Limits::depth(XDR_DEPTH_LIMIT))?
256 );
257 Ok(())
258 }
259}