use crate::sns::report::text::common::sns_identity_lines;
use crate::sns::report::sns_proposal_action_label;
use ic_host_text::timestamp::format_utc_timestamp_secs;
use crate::text_value::REPORT_TABLE_OPTIONS;
use ic_host_text::{
escape::terminal_text,
table::{Alignment, render},
};
use super::{
SNS_PROPOSAL_DETAIL_TEXT_LIMIT,
detail::{proposal_detail_lines, proposal_title_for_list},
};
use crate::{
sns::report::{SnsProposalsReport, text::common::push_report_provenance_lines},
text_value::{optional_u64_text, yes_no},
};
#[must_use]
pub fn sns_proposals_report_text(report: &SnsProposalsReport) -> String {
let mut lines = sns_identity_lines(&report.context);
lines.extend([
format!("requested_limit: {}", report.requested_limit),
format!(
"before_proposal_id: {}",
optional_u64_text(report.before_proposal_id)
),
format!("status_filter: {}", report.status_filter),
format!("topic_filter: {}", report.topic_filter),
format!("eligibility_filter: {}", report.eligibility_filter),
format!(
"proposer_filter: {}",
terminal_text(report.proposer_filter.as_deref().unwrap_or("-"))
),
format!(
"query_filter: {}",
terminal_text(report.query_filter.as_deref().unwrap_or("-"))
),
format!("sort: {}", report.sort),
format!("sort_direction: {}", report.sort_direction),
format!("verbose: {}", yes_no(report.verbose)),
]);
push_report_provenance_lines(
&mut lines,
report.data_source,
report.cache_path.as_deref(),
report.cache_complete,
);
lines.extend([format!("proposal_count: {}", report.proposal_count)]);
lines.extend(crate::sns::report::text::common::sns_collection_lines(
&report.context,
));
if !report.proposals.is_empty() {
lines.push(String::new());
lines.push(render(
&["ID", "ACTION", "DECISION", "CREATED_AT", "TITLE"],
&report
.proposals
.iter()
.map(|proposal| {
[
proposal.proposal_id.to_string(),
sns_proposal_action_label(proposal.action_id).into_owned(),
proposal.decision_state.as_str().to_string(),
format_utc_timestamp_secs(proposal.proposal_creation_timestamp_seconds),
proposal_title_for_list(proposal, report.verbose),
]
})
.collect::<Vec<_>>(),
&[
Alignment::Right,
Alignment::Left,
Alignment::Left,
Alignment::Left,
Alignment::Left,
],
REPORT_TABLE_OPTIONS,
));
}
if report.verbose && !report.proposals.is_empty() {
lines.push(String::new());
lines.push("proposal_details:".to_string());
for proposal in &report.proposals {
lines.extend(proposal_detail_lines(
proposal,
Some(SNS_PROPOSAL_DETAIL_TEXT_LIMIT),
));
}
}
lines.join("\n")
}