use thiserror::Error;
pub use yldfi_common::api::ApiError;
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum DomainError {
#[error("Invalid parameter: {0}")]
InvalidParam(String),
#[error("Unsupported chain: {0}")]
UnsupportedChain(String),
#[error("No route found for swap")]
NoRouteFound,
}
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)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_invalid_param_error() {
let err = invalid_param("missing token address");
let display = format!("{err}");
assert!(display.contains("Invalid parameter"));
assert!(display.contains("missing token address"));
}
#[test]
fn test_unsupported_chain_error() {
let err = unsupported_chain("solana");
let display = format!("{err}");
assert!(display.contains("Unsupported chain"));
assert!(display.contains("solana"));
}
#[test]
fn test_no_route_found_error() {
let err = no_route_found();
let display = format!("{err}");
assert!(display.contains("No route found"));
}
#[test]
fn test_domain_error_variants() {
let _ = DomainError::InvalidParam("test".to_string());
let _ = DomainError::UnsupportedChain("test".to_string());
let _ = DomainError::NoRouteFound;
}
#[test]
fn test_error_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Error>();
}
}