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