use cow_sdk_core::ValidationReason;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::AppDataError;
const MAX_SLIPPAGE_BIPS: u32 = 10_000;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QuoteMetadata {
pub slippage_bips: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub smart_slippage: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
impl QuoteMetadata {
pub fn new(slippage_bips: u32) -> Result<Self, AppDataError> {
let quote = Self {
slippage_bips,
smart_slippage: None,
version: None,
};
quote.validate()?;
Ok(quote)
}
pub const fn validate(&self) -> Result<(), AppDataError> {
if self.slippage_bips > MAX_SLIPPAGE_BIPS {
return Err(AppDataError::InvalidAppDataProvided {
field: "metadata.quote.slippageBips",
reason: ValidationReason::OutOfRange {
details: "slippageBips must be an integer in the inclusive range [0, 10000]",
},
});
}
Ok(())
}
pub fn from_value(value: Value) -> Result<Self, AppDataError> {
serde_json::from_value(value).map_err(AppDataError::from)
}
}