mostro_client/
pretty_table.rs1use 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 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 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 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 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 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 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 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 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 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 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 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}