Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit b90903c

Browse files
committed
token-cli: impl two extensions for display
also indent all the displys cutely
1 parent 6d61b8e commit b90903c

File tree

1 file changed

+63
-29
lines changed

1 file changed

+63
-29
lines changed

token/cli/src/output.rs

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::{config::Config, sort::UnsupportedAccount};
22
use console::Emoji;
33
use serde::{Deserialize, Serialize, Serializer};
4-
use solana_account_decoder::parse_token::{
5-
UiAccountState, UiMint, UiMultisig, UiTokenAccount, UiTokenAmount,
4+
use solana_account_decoder::{
5+
parse_token::{UiAccountState, UiMint, UiMultisig, UiTokenAccount, UiTokenAmount},
6+
parse_token_extension::{UiExtension, UiMintCloseAuthority},
67
};
78
use solana_cli_output::{display::writeln_name_value, OutputFormat, QuietDisplay, VerboseDisplay};
89
use std::fmt::{self, Display};
@@ -162,15 +163,16 @@ impl fmt::Display for CliMultisig {
162163
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
163164
let m = self.multisig.num_required_signers;
164165
let n = self.multisig.num_valid_signers;
166+
165167
writeln!(f)?;
166-
writeln_name_value(f, "Type:", "Multisig")?;
167-
writeln_name_value(f, "Address:", &self.address)?;
168-
writeln_name_value(f, "Program:", &self.program_id)?;
169-
writeln_name_value(f, "M/N:", &format!("{}/{}", m, n))?;
170-
writeln_name_value(f, "Signers:", " ")?;
168+
writeln_name_value(f, "SPL Token Multisig", " ")?;
169+
writeln_name_value(f, " Address:", &self.address)?;
170+
writeln_name_value(f, " Program:", &self.program_id)?;
171+
writeln_name_value(f, " M/N:", &format!("{}/{}", m, n))?;
172+
writeln_name_value(f, " Signers:", " ")?;
171173
let width = if n >= 9 { 4 } else { 3 };
172174
for i in 0..n as usize {
173-
let title = format!("{1:>0$}:", width, i + 1);
175+
let title = format!(" {1:>0$}:", width, i + 1);
174176
let pubkey = &self.multisig.signers[i];
175177
writeln_name_value(f, &title, pubkey)?;
176178
}
@@ -195,21 +197,21 @@ impl VerboseDisplay for CliTokenAccount {}
195197
impl fmt::Display for CliTokenAccount {
196198
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
197199
writeln!(f)?;
198-
writeln_name_value(f, "Type:", "Account")?;
200+
writeln_name_value(f, "SPL Token Account", " ")?;
199201
if self.is_associated {
200-
writeln_name_value(f, "Address:", &self.address)?;
202+
writeln_name_value(f, " Address:", &self.address)?;
201203
} else {
202-
writeln_name_value(f, "Address:", &format!("{} (Aux*)", self.address))?;
204+
writeln_name_value(f, " Address:", &format!("{} (Aux*)", self.address))?;
203205
}
204-
writeln_name_value(f, "Program:", &self.program_id)?;
206+
writeln_name_value(f, " Program:", &self.program_id)?;
205207
writeln_name_value(
206208
f,
207-
"Balance:",
209+
" Balance:",
208210
&self.account.token_amount.real_number_string_trimmed(),
209211
)?;
210212
writeln_name_value(
211213
f,
212-
"Decimals:",
214+
" Decimals:",
213215
if self.decimals.is_some() {
214216
self.decimals.unwrap().to_string()
215217
} else {
@@ -226,29 +228,38 @@ impl fmt::Display for CliTokenAccount {
226228
""
227229
}
228230
);
229-
writeln_name_value(f, "Mint:", &mint)?;
230-
writeln_name_value(f, "Owner:", &self.account.owner)?;
231-
writeln_name_value(f, "State:", &format!("{:?}", self.account.state))?;
231+
writeln_name_value(f, " Mint:", &mint)?;
232+
writeln_name_value(f, " Owner:", &self.account.owner)?;
233+
writeln_name_value(f, " State:", &format!("{:?}", self.account.state))?;
232234
if let Some(delegate) = &self.account.delegate {
233-
writeln!(f, "Delegation:")?;
234-
writeln_name_value(f, " Delegate:", delegate)?;
235+
writeln!(f, " Delegation:")?;
236+
writeln_name_value(f, " Delegate:", delegate)?;
235237
let allowance = self.account.delegated_amount.as_ref().unwrap();
236-
writeln_name_value(f, " Allowance:", &allowance.real_number_string_trimmed())?;
238+
writeln_name_value(f, " Allowance:", &allowance.real_number_string_trimmed())?;
237239
} else {
238-
writeln_name_value(f, "Delegation:", "")?;
240+
writeln_name_value(f, " Delegation:", "")?;
239241
}
240242
writeln_name_value(
241243
f,
242-
"Close authority:",
244+
" Close authority:",
243245
self.account
244246
.close_authority
245247
.as_ref()
246248
.unwrap_or(&String::new()),
247249
)?;
250+
251+
if !self.account.extensions.is_empty() {
252+
writeln_name_value(f, "Extensions", " ")?;
253+
for extension in &self.account.extensions {
254+
display_ui_extension(f, extension)?;
255+
}
256+
}
257+
248258
if !self.is_associated {
249259
writeln!(f)?;
250260
writeln!(f, "* Please run `spl-token gc` to clean up Aux accounts")?;
251261
}
262+
252263
Ok(())
253264
}
254265
}
@@ -268,24 +279,33 @@ impl VerboseDisplay for CliMint {}
268279
impl fmt::Display for CliMint {
269280
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
270281
writeln!(f)?;
271-
writeln_name_value(f, "Type:", "Mint")?;
272-
writeln_name_value(f, "Address:", &self.address)?;
273-
writeln_name_value(f, "Program:", &self.program_id)?;
274-
writeln_name_value(f, "Supply:", &self.mint.supply)?;
275-
writeln_name_value(f, "Decimals:", &self.mint.decimals.to_string())?;
282+
writeln_name_value(f, "SPL Token Mint", " ")?;
283+
284+
writeln_name_value(f, " Address:", &self.address)?;
285+
writeln_name_value(f, " Program:", &self.program_id)?;
286+
writeln_name_value(f, " Supply:", &self.mint.supply)?;
287+
writeln_name_value(f, " Decimals:", &self.mint.decimals.to_string())?;
276288
writeln_name_value(
277289
f,
278-
"Mint authority:",
290+
" Mint authority:",
279291
self.mint.mint_authority.as_ref().unwrap_or(&String::new()),
280292
)?;
281293
writeln_name_value(
282294
f,
283-
"Freeze authority:",
295+
" Freeze authority:",
284296
self.mint
285297
.freeze_authority
286298
.as_ref()
287299
.unwrap_or(&String::new()),
288300
)?;
301+
302+
if !self.mint.extensions.is_empty() {
303+
writeln_name_value(f, "Extensions", " ")?;
304+
for extension in &self.mint.extensions {
305+
display_ui_extension(f, extension)?;
306+
}
307+
}
308+
289309
Ok(())
290310
}
291311
}
@@ -456,6 +476,20 @@ impl fmt::Display for CliTokenAccounts {
456476
}
457477
}
458478

479+
fn display_ui_extension(f: &mut fmt::Formatter, ui_extension: &UiExtension) -> fmt::Result {
480+
match ui_extension {
481+
UiExtension::MintCloseAuthority(UiMintCloseAuthority { close_authority }) => {
482+
writeln_name_value(
483+
f,
484+
" Close authority:",
485+
close_authority.as_ref().unwrap_or(&String::new()),
486+
)
487+
}
488+
UiExtension::ImmutableOwner => writeln_name_value(f, " Immutable owner:", "Enabled"),
489+
_ => unimplemented!(),
490+
}
491+
}
492+
459493
fn flattened<S: Serializer>(
460494
vec: &[Vec<CliTokenAccount>],
461495
serializer: S,

0 commit comments

Comments
 (0)