mostro_client/
pretty_table.rs

1use anyhow::Result;
2use chrono::DateTime;
3use comfy_table::presets::UTF8_FULL;
4use comfy_table::*;
5use mostro_core::dispute::Dispute;
6use mostro_core::message::Payload;
7use mostro_core::order::{Kind, SmallOrder};
8
9pub fn print_order_preview(ord: Payload) -> Result<String, String> {
10    let single_order = match ord {
11        Payload::Order(o) => o,
12        _ => return Err("Error".to_string()),
13    };
14
15    let mut table = Table::new();
16
17    table
18        .load_preset(UTF8_FULL)
19        .set_content_arrangement(ContentArrangement::Dynamic)
20        .set_width(160)
21        .set_header(vec![
22            Cell::new("Buy/Sell")
23                .add_attribute(Attribute::Bold)
24                .set_alignment(CellAlignment::Center),
25            Cell::new("Sats Amount")
26                .add_attribute(Attribute::Bold)
27                .set_alignment(CellAlignment::Center),
28            Cell::new("Fiat Code")
29                .add_attribute(Attribute::Bold)
30                .set_alignment(CellAlignment::Center),
31            Cell::new("Fiat Amount")
32                .add_attribute(Attribute::Bold)
33                .set_alignment(CellAlignment::Center),
34            Cell::new("Payment method")
35                .add_attribute(Attribute::Bold)
36                .set_alignment(CellAlignment::Center),
37            Cell::new("Premium %")
38                .add_attribute(Attribute::Bold)
39                .set_alignment(CellAlignment::Center),
40        ]);
41
42    //Table rows
43    let r = Row::from(vec![
44        if let Some(k) = single_order.kind {
45            match k {
46                Kind::Buy => Cell::new(k.to_string())
47                    .fg(Color::Green)
48                    .set_alignment(CellAlignment::Center),
49                Kind::Sell => Cell::new(k.to_string())
50                    .fg(Color::Red)
51                    .set_alignment(CellAlignment::Center),
52            }
53        } else {
54            Cell::new("BUY/SELL").set_alignment(CellAlignment::Center)
55        },
56        if single_order.amount == 0 {
57            Cell::new("market price").set_alignment(CellAlignment::Center)
58        } else {
59            Cell::new(single_order.amount).set_alignment(CellAlignment::Center)
60        },
61        Cell::new(single_order.fiat_code.to_string()).set_alignment(CellAlignment::Center),
62        // No range order print row
63        if single_order.min_amount.is_none() && single_order.max_amount.is_none() {
64            Cell::new(single_order.fiat_amount.to_string()).set_alignment(CellAlignment::Center)
65        } else {
66            let range_str = format!(
67                "{}-{}",
68                single_order.min_amount.unwrap(),
69                single_order.max_amount.unwrap()
70            );
71            Cell::new(range_str).set_alignment(CellAlignment::Center)
72        },
73        Cell::new(single_order.payment_method.to_string()).set_alignment(CellAlignment::Center),
74        Cell::new(single_order.premium.to_string()).set_alignment(CellAlignment::Center),
75    ]);
76
77    table.add_row(r);
78
79    Ok(table.to_string())
80}
81
82pub fn print_orders_table(orders_table: Vec<SmallOrder>) -> Result<String> {
83    let mut table = Table::new();
84
85    //Table rows
86    let mut rows: Vec<Row> = Vec::new();
87
88    if orders_table.is_empty() {
89        table
90            .load_preset(UTF8_FULL)
91            .set_content_arrangement(ContentArrangement::Dynamic)
92            .set_width(160)
93            .set_header(vec![Cell::new("Sorry...")
94                .add_attribute(Attribute::Bold)
95                .set_alignment(CellAlignment::Center)]);
96
97        // Single row for error
98        let mut r = Row::new();
99
100        r.add_cell(
101            Cell::new("No offers found with requested parameters...")
102                .fg(Color::Red)
103                .set_alignment(CellAlignment::Center),
104        );
105
106        //Push single error row
107        rows.push(r);
108    } else {
109        table
110            .load_preset(UTF8_FULL)
111            .set_content_arrangement(ContentArrangement::Dynamic)
112            .set_width(160)
113            .set_header(vec![
114                Cell::new("Buy/Sell")
115                    .add_attribute(Attribute::Bold)
116                    .set_alignment(CellAlignment::Center),
117                Cell::new("Order Id")
118                    .add_attribute(Attribute::Bold)
119                    .set_alignment(CellAlignment::Center),
120                Cell::new("Status")
121                    .add_attribute(Attribute::Bold)
122                    .set_alignment(CellAlignment::Center),
123                Cell::new("Amount")
124                    .add_attribute(Attribute::Bold)
125                    .set_alignment(CellAlignment::Center),
126                Cell::new("Fiat Code")
127                    .add_attribute(Attribute::Bold)
128                    .set_alignment(CellAlignment::Center),
129                Cell::new("Fiat Amount")
130                    .add_attribute(Attribute::Bold)
131                    .set_alignment(CellAlignment::Center),
132                Cell::new("Payment method")
133                    .add_attribute(Attribute::Bold)
134                    .set_alignment(CellAlignment::Center),
135                Cell::new("Created")
136                    .add_attribute(Attribute::Bold)
137                    .set_alignment(CellAlignment::Center),
138            ]);
139
140        //Iterate to create table of orders
141        for single_order in orders_table.into_iter() {
142            let date = DateTime::from_timestamp(single_order.created_at.unwrap_or(0), 0);
143
144            let r = Row::from(vec![
145                if let Some(k) = single_order.kind {
146                    match k {
147                        Kind::Buy => Cell::new(k.to_string())
148                            .fg(Color::Green)
149                            .set_alignment(CellAlignment::Center),
150                        Kind::Sell => Cell::new(k.to_string())
151                            .fg(Color::Red)
152                            .set_alignment(CellAlignment::Center),
153                    }
154                } else {
155                    Cell::new("BUY/SELL").set_alignment(CellAlignment::Center)
156                },
157                Cell::new(single_order.id.unwrap()).set_alignment(CellAlignment::Center),
158                Cell::new(single_order.status.unwrap().to_string())
159                    .set_alignment(CellAlignment::Center),
160                if single_order.amount == 0 {
161                    Cell::new("market price").set_alignment(CellAlignment::Center)
162                } else {
163                    Cell::new(single_order.amount.to_string()).set_alignment(CellAlignment::Center)
164                },
165                Cell::new(single_order.fiat_code.to_string()).set_alignment(CellAlignment::Center),
166                // No range order print row
167                if single_order.min_amount.is_none() && single_order.max_amount.is_none() {
168                    Cell::new(single_order.fiat_amount.to_string())
169                        .set_alignment(CellAlignment::Center)
170                } else {
171                    let range_str = format!(
172                        "{}-{}",
173                        single_order.min_amount.unwrap(),
174                        single_order.max_amount.unwrap()
175                    );
176                    Cell::new(range_str).set_alignment(CellAlignment::Center)
177                },
178                Cell::new(single_order.payment_method.to_string())
179                    .set_alignment(CellAlignment::Center),
180                Cell::new(date.unwrap()),
181            ]);
182            rows.push(r);
183        }
184    }
185
186    table.add_rows(rows);
187
188    Ok(table.to_string())
189}
190
191pub fn print_disputes_table(disputes_table: Vec<Dispute>) -> Result<String> {
192    let mut table = Table::new();
193
194    //Table rows
195    let mut rows: Vec<Row> = Vec::new();
196
197    if disputes_table.is_empty() {
198        table
199            .load_preset(UTF8_FULL)
200            .set_content_arrangement(ContentArrangement::Dynamic)
201            .set_width(160)
202            .set_header(vec![Cell::new("Sorry...")
203                .add_attribute(Attribute::Bold)
204                .set_alignment(CellAlignment::Center)]);
205
206        // Single row for error
207        let mut r = Row::new();
208
209        r.add_cell(
210            Cell::new("No disputes found with requested parameters...")
211                .fg(Color::Red)
212                .set_alignment(CellAlignment::Center),
213        );
214
215        //Push single error row
216        rows.push(r);
217    } else {
218        table
219            .load_preset(UTF8_FULL)
220            .set_content_arrangement(ContentArrangement::Dynamic)
221            .set_width(160)
222            .set_header(vec![
223                Cell::new("Dispute Id")
224                    .add_attribute(Attribute::Bold)
225                    .set_alignment(CellAlignment::Center),
226                Cell::new("Status")
227                    .add_attribute(Attribute::Bold)
228                    .set_alignment(CellAlignment::Center),
229                Cell::new("Created")
230                    .add_attribute(Attribute::Bold)
231                    .set_alignment(CellAlignment::Center),
232            ]);
233
234        //Iterate to create table of orders
235        for single_dispute in disputes_table.into_iter() {
236            let date = DateTime::from_timestamp(single_dispute.created_at, 0);
237
238            let r = Row::from(vec![
239                Cell::new(single_dispute.id).set_alignment(CellAlignment::Center),
240                Cell::new(single_dispute.status.to_string()).set_alignment(CellAlignment::Center),
241                Cell::new(date.unwrap()),
242            ]);
243            rows.push(r);
244        }
245    }
246
247    table.add_rows(rows);
248
249    Ok(table.to_string())
250}