use super::{super::error::CoreError, QuoteType, SingleSideLiquidity};
pub(crate) fn flat_liquidity(
price: u128,
quote_type: QuoteType,
reserves_a: u64,
reserves_b: u64,
) -> Result<SingleSideLiquidity, CoreError> {
let mut liquidity = SingleSideLiquidity::new();
if quote_type.a_to_b() {
liquidity.push((price, reserves_b));
} else {
liquidity.push((price, reserves_a));
}
Ok(liquidity)
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::rstest;
#[rstest]
#[case(QuoteType::TokenAExactIn, 1000, 2000, Ok(2000))]
#[case(QuoteType::TokenAExactOut, 1000, 2000, Ok(1000))]
#[case(QuoteType::TokenBExactIn, 1000, 2000, Ok(1000))]
#[case(QuoteType::TokenBExactOut, 1000, 2000, Ok(2000))]
fn test_flat_liquidity(
#[case] quote_type: QuoteType,
#[case] reserves_a: u64,
#[case] reserves_b: u64,
#[case] expected: Result<u64, CoreError>,
) {
let price = 1 << 64;
let liquidity = flat_liquidity(price, quote_type, reserves_a, reserves_b);
let expected = expected.map(|x| SingleSideLiquidity::from_slice(&[(price, x)]));
assert_eq!(liquidity, expected);
}
}