egui_charts/ui/trading/
format.rs1use super::widgets::grouped;
4
5pub trait TradingFormatter: Send + Sync {
12 fn price(&self, _symbol: &str, _price: f64) -> Option<String> {
14 None
15 }
16
17 fn quantity(&self, _symbol: &str, _quantity: f64) -> Option<String> {
19 None
20 }
21
22 fn spread(&self, _symbol: &str, _spread: f64) -> Option<String> {
24 None
25 }
26
27 fn pip_value(&self, _symbol: &str, _value: f64) -> Option<String> {
29 None
30 }
31}
32
33#[derive(Clone, Copy)]
35pub(super) struct Numbers<'a> {
36 pub symbol: &'a str,
37 pub decimals: usize,
39 pub formatter: Option<&'a dyn TradingFormatter>,
40}
41
42impl Numbers<'_> {
43 pub fn price(&self, price: f64) -> String {
44 self.formatter
45 .and_then(|formatter| formatter.price(self.symbol, price))
46 .unwrap_or_else(|| grouped(price, self.decimals, false))
47 }
48
49 pub fn quantity(&self, quantity: f64, decimals: usize) -> String {
51 self.formatter
52 .and_then(|formatter| formatter.quantity(self.symbol, quantity))
53 .unwrap_or_else(|| grouped(quantity, decimals, false))
54 }
55
56 pub fn spread(&self, spread: f64) -> String {
57 self.formatter
58 .and_then(|formatter| formatter.spread(self.symbol, spread))
59 .unwrap_or_else(|| grouped(spread, self.decimals, false))
60 }
61
62 pub fn pip_value(&self, value: f64) -> String {
63 self.formatter
64 .and_then(|formatter| formatter.pip_value(self.symbol, value))
65 .unwrap_or_else(|| grouped(value, self.decimals.max(2), false))
66 }
67}