diff --git a/cli-output/src/cli_output.rs b/cli-output/src/cli_output.rs index cc2e05ea8a..d5e7759079 100644 --- a/cli-output/src/cli_output.rs +++ b/cli-output/src/cli_output.rs @@ -1,5 +1,8 @@ use crate::{ - display::{build_balance_message, format_labeled_address, writeln_name_value}, + display::{ + build_balance_message, build_balance_message_with_config, format_labeled_address, + writeln_name_value, BuildBalanceMessageConfig, + }, QuietDisplay, VerboseDisplay, }; use chrono::{DateTime, NaiveDateTime, SecondsFormat, Utc}; @@ -866,14 +869,19 @@ impl fmt::Display for CliStakeHistory { )) .bold() )?; + let config = BuildBalanceMessageConfig { + use_lamports_unit: self.use_lamports_unit, + show_unit: false, + trim_trailing_zeros: false, + }; for entry in &self.entries { writeln!( f, " {:>5} {:>20} {:>20} {:>20} {}", entry.epoch, - build_balance_message(entry.effective_stake, self.use_lamports_unit, false), - build_balance_message(entry.activating_stake, self.use_lamports_unit, false), - build_balance_message(entry.deactivating_stake, self.use_lamports_unit, false), + build_balance_message_with_config(entry.effective_stake, &config), + build_balance_message_with_config(entry.activating_stake, &config), + build_balance_message_with_config(entry.deactivating_stake, &config), if self.use_lamports_unit { "lamports" } else { diff --git a/cli-output/src/display.rs b/cli-output/src/display.rs index 273502db99..bb33f1afb7 100644 --- a/cli-output/src/display.rs +++ b/cli-output/src/display.rs @@ -7,22 +7,63 @@ use solana_sdk::{ use solana_transaction_status::UiTransactionStatusMeta; use std::{collections::HashMap, fmt, io}; -pub fn build_balance_message(lamports: u64, use_lamports_unit: bool, show_unit: bool) -> String { - if use_lamports_unit { - let ess = if lamports == 1 { "" } else { "s" }; - let unit = if show_unit { - format!(" lamport{}", ess) - } else { - "".to_string() - }; - format!("{:?}{}", lamports, unit) +#[derive(Clone, Debug)] +pub struct BuildBalanceMessageConfig { + pub use_lamports_unit: bool, + pub show_unit: bool, + pub trim_trailing_zeros: bool, +} + +impl Default for BuildBalanceMessageConfig { + fn default() -> Self { + Self { + use_lamports_unit: false, + show_unit: true, + trim_trailing_zeros: true, + } + } +} + +pub fn build_balance_message_with_config( + lamports: u64, + config: &BuildBalanceMessageConfig, +) -> String { + let value = if config.use_lamports_unit { + lamports.to_string() } else { let sol = lamports_to_sol(lamports); let sol_str = format!("{:.9}", sol); - let pretty_sol = sol_str.trim_end_matches('0').trim_end_matches('.'); - let unit = if show_unit { " SOL" } else { "" }; - format!("{}{}", pretty_sol, unit) - } + if config.trim_trailing_zeros { + sol_str + .trim_end_matches('0') + .trim_end_matches('.') + .to_string() + } else { + sol_str + } + }; + let unit = if config.show_unit { + if config.use_lamports_unit { + let ess = if lamports == 1 { "" } else { "s" }; + format!(" lamport{}", ess) + } else { + " SOL".to_string() + } + } else { + "".to_string() + }; + format!("{}{}", value, unit) +} + +pub fn build_balance_message(lamports: u64, use_lamports_unit: bool, show_unit: bool) -> String { + build_balance_message_with_config( + lamports, + &BuildBalanceMessageConfig { + use_lamports_unit, + show_unit, + ..BuildBalanceMessageConfig::default() + }, + ) } // Pretty print a "name value"