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