mostro_client/parser/
common.rs

1use chrono::DateTime;
2use comfy_table::presets::UTF8_FULL;
3use comfy_table::*;
4
5/// Apply color coding to status cells based on status type
6pub fn apply_status_color(cell: Cell, status: &str) -> Cell {
7    let status_lower = status.to_lowercase();
8
9    if status_lower.contains("init")
10        || status_lower.contains("pending")
11        || status_lower.contains("waiting")
12    {
13        cell.fg(Color::Yellow)
14    } else if status_lower.contains("active")
15        || status_lower.contains("released")
16        || status_lower.contains("settled")
17        || status_lower.contains("taken")
18        || status_lower.contains("success")
19    {
20        cell.fg(Color::Green)
21    } else if status_lower.contains("fiat") {
22        cell.fg(Color::Cyan)
23    } else if status_lower.contains("dispute")
24        || status_lower.contains("cancel")
25        || status_lower.contains("canceled")
26    {
27        cell.fg(Color::Red)
28    } else {
29        cell
30    }
31}
32
33/// Apply color coding to order kind cells
34pub fn apply_kind_color(cell: Cell, kind: &mostro_core::order::Kind) -> Cell {
35    match kind {
36        mostro_core::order::Kind::Buy => cell.fg(Color::Green),
37        mostro_core::order::Kind::Sell => cell.fg(Color::Red),
38    }
39}
40
41/// Create a red error cell for "no data found" messages
42pub fn create_error_cell(message: &str) -> Cell {
43    Cell::new(message)
44        .fg(Color::Red)
45        .set_alignment(CellAlignment::Center)
46}
47
48/// Create a standard table with UTF8_FULL preset and dynamic arrangement
49pub fn create_standard_table() -> Table {
50    let mut table = Table::new();
51    table
52        .load_preset(UTF8_FULL)
53        .set_content_arrangement(ContentArrangement::Dynamic);
54    table
55}
56
57/// Create a standard field/value table header
58pub fn create_field_value_header() -> Vec<Cell> {
59    vec![
60        Cell::new("Field")
61            .add_attribute(Attribute::Bold)
62            .set_alignment(CellAlignment::Center),
63        Cell::new("Value")
64            .add_attribute(Attribute::Bold)
65            .set_alignment(CellAlignment::Center),
66    ]
67}
68
69/// Create a centered cell with optional bold formatting
70pub fn create_centered_cell(content: &str, bold: bool) -> Cell {
71    let mut cell = Cell::new(content).set_alignment(CellAlignment::Center);
72    if bold {
73        cell = cell.add_attribute(Attribute::Bold);
74    }
75    cell
76}
77
78/// Create a field/value row for tables
79pub fn create_field_value_row(field: &str, value: &str) -> Row {
80    Row::from(vec![
81        Cell::new(field).set_alignment(CellAlignment::Center),
82        Cell::new(value).set_alignment(CellAlignment::Center),
83    ])
84}
85
86/// Format timestamp to human-readable string
87pub fn format_timestamp(timestamp: i64) -> String {
88    DateTime::from_timestamp(timestamp, 0)
89        .map(|dt| dt.format("%Y-%m-%d %H:%M:%S UTC").to_string())
90        .unwrap_or_else(|| "Invalid timestamp".to_string())
91}
92
93/// Create a field/value row with emoji field
94pub fn create_emoji_field_row(emoji: &str, field: &str, value: &str) -> Row {
95    Row::from(vec![
96        Cell::new(format!("{}{}", emoji, field)).set_alignment(CellAlignment::Center),
97        Cell::new(value).set_alignment(CellAlignment::Center),
98    ])
99}
100
101/// Print a standard section header with title and separator
102pub fn print_section_header(title: &str) {
103    println!("{}", title);
104    println!("═══════════════════════════════════════");
105}
106
107/// Print a success message with consistent formatting
108pub fn print_success_message(message: &str) {
109    println!("✅ {}", message);
110}
111
112/// Print an info message with consistent formatting
113pub fn print_info_message(message: &str) {
114    println!("💡 {}", message);
115}
116
117/// Print a no-data message with consistent formatting
118pub fn print_no_data_message(message: &str) {
119    println!("📭 {}", message);
120}
121
122/// Print a key-value pair with consistent formatting
123pub fn print_key_value(emoji: &str, key: &str, value: &str) {
124    println!("{} {}: {}", emoji, key, value);
125}
126
127/// Print a simple info line with consistent formatting
128pub fn print_info_line(emoji: &str, message: &str) {
129    println!("{} {}", emoji, message);
130}
131
132/// Print order information with consistent formatting
133pub fn print_order_info(
134    order_id: &str,
135    amount: i64,
136    fiat_code: &str,
137    premium: i64,
138    payment_method: &str,
139) {
140    println!("📋 Order ID: {}", order_id);
141    println!("💰 Amount: {} sats", amount);
142    println!("💱 Fiat Code: {}", fiat_code);
143    println!("📊 Premium: {}%", premium);
144    println!("💳 Payment Method: {}", payment_method);
145}
146
147/// Print order status information
148pub fn print_order_status(status: &str) {
149    println!("📊 Status: {}", status);
150}
151
152/// Print amount information
153pub fn print_amount_info(amount: i64) {
154    println!("💰 Amount: {} sats", amount);
155}
156
157/// Print required amount information
158pub fn print_required_amount(amount: i64) {
159    println!("💰 Required Amount: {} sats", amount);
160}
161
162/// Print fiat code information
163pub fn print_fiat_code(fiat_code: &str) {
164    println!("💱 Fiat Code: {}", fiat_code);
165}
166
167/// Print premium information
168pub fn print_premium(premium: i64) {
169    println!("📊 Premium: {}%", premium);
170}
171
172/// Print payment method information
173pub fn print_payment_method(payment_method: &str) {
174    println!("💳 Payment Method: {}", payment_method);
175}
176
177/// Print trade index information
178pub fn print_trade_index(trade_index: u64) {
179    println!("🔢 Last Trade Index: {}", trade_index);
180}
181
182/// Print order count information
183pub fn print_order_count(count: usize) {
184    println!("📊 Found {} order(s):", count);
185}