binance_client/http_api_v3/data/exchange_info/symbol/
mod.rs1pub mod filter;
6pub mod status;
7
8use rust_decimal::Decimal;
9use serde::Deserialize;
10
11use crate::http_api_v3::data::order_type::OrderType;
12use crate::http_api_v3::data::permission::Permission;
13
14use self::filter::Filter;
15use self::status::Status;
16
17#[derive(Debug, Deserialize, Clone)]
21#[serde(rename_all = "camelCase")]
22pub struct Symbol {
23 pub symbol: String,
25 pub status: Status,
27 pub base_asset: String,
29 pub base_asset_precision: usize,
32 pub quote_asset: String,
34 pub quote_precision: usize,
37 pub order_types: Vec<OrderType>,
39 pub iceberg_allowed: bool,
41 pub filters: Vec<Filter>,
43 pub permissions: Vec<Permission>,
45}
46
47impl Symbol {
48 pub fn is_trading(&self) -> bool {
52 matches!(self.status, Status::Trading)
53 }
54
55 pub fn has_margin(&self) -> bool {
59 self.permissions.contains(&Permission::Margin)
60 }
61
62 pub fn price_precision(&self) -> Option<u32> {
69 for filter in self.filters.iter() {
70 if let Filter::PriceFilter { tick_size, .. } = filter {
71 let mut scale = crate::r#const::PRECISION_DEFAULT;
72 let mut tick_size_check = Decimal::new(1, scale);
73 while *tick_size > tick_size_check && scale > 0 {
74 tick_size_check *= Decimal::new(10, 0);
75 scale -= 1;
76 }
77 return Some(scale);
78 }
79 }
80 None
81 }
82
83 pub fn quantity_precision(&self) -> Option<u32> {
87 for filter in self.filters.iter() {
88 if let Filter::LotSize { step_size, .. } = filter {
89 let mut scale = crate::r#const::PRECISION_DEFAULT;
90 let mut step_size_check = Decimal::new(1, scale);
91 while *step_size > step_size_check && scale > 0 {
92 step_size_check *= Decimal::new(10, 0);
93 scale -= 1;
94 }
95 return Some(scale);
96 }
97 }
98 None
99 }
100}