mostro_client/
pretty_table.rs

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