substrate_stellar_sdk/xdr/impls/
price.rs1use num_rational::Ratio;
2
3use crate::{Price, StellarSdkError};
4
5impl Price {
6 pub fn from_fraction(denominator: i32, numerator: i32) -> Result<Price, StellarSdkError> {
7 if denominator <= 0 || numerator <= 0 {
8 return Err(StellarSdkError::InvalidPrice)
9 }
10
11 Ok(Price { d: denominator, n: numerator })
12 }
13
14 pub fn from_float(price: f64) -> Result<Price, StellarSdkError> {
15 if price <= 0.0 {
16 return Err(StellarSdkError::InvalidPrice)
17 }
18
19 Ratio::<i32>::approximate_float(price)
20 .ok_or(StellarSdkError::NotApproximableAsFraction)
21 .map(|price| Price { d: *price.denom(), n: *price.numer() })
22 }
23}