use thiserror::Error;
pub use yldfi_common::api::ApiError;
#[derive(Error, Debug)]
pub enum DomainError {
#[error("Invalid parameter: {0}")]
InvalidParam(String),
#[error("Unsupported chain: {0}")]
UnsupportedChain(String),
#[error("No route found for swap")]
NoRouteFound,
#[error("Insufficient liquidity for swap")]
InsufficientLiquidity,
#[error("Token not found: {0}")]
TokenNotFound(String),
#[error("API key is required for 1inch API")]
MissingApiKey,
}
pub type Error = ApiError<DomainError>;
pub type Result<T> = std::result::Result<T, Error>;
pub fn invalid_param(message: impl Into<String>) -> Error {
ApiError::domain(DomainError::InvalidParam(message.into()))
}
pub fn unsupported_chain(chain: impl Into<String>) -> Error {
ApiError::domain(DomainError::UnsupportedChain(chain.into()))
}
#[must_use]
pub fn no_route_found() -> Error {
ApiError::domain(DomainError::NoRouteFound)
}
#[must_use]
pub fn insufficient_liquidity() -> Error {
ApiError::domain(DomainError::InsufficientLiquidity)
}
pub fn token_not_found(token: impl Into<String>) -> Error {
ApiError::domain(DomainError::TokenNotFound(token.into()))
}
#[must_use]
pub fn missing_api_key() -> Error {
ApiError::domain(DomainError::MissingApiKey)
}
#[must_use]
pub fn from_response(status: u16, body: &str, retry_after: Option<u64>) -> Error {
if status == 400 {
if body.contains("insufficient liquidity") {
return insufficient_liquidity();
}
if body.contains("cannot find route") || body.contains("No route found") {
return no_route_found();
}
}
ApiError::from_response(status, body, retry_after)
}