substrate_stellar_sdk/xdr/impls/
price.rs

1use 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}