aineed-core 0.1.1

Core library for the aineed AI assistant tool
Documentation
use std::fmt;
use std::io;
use reqwest::StatusCode;

#[derive(Debug)]
pub enum AiNeedError {
    IoError(io::Error),
    ConfigError(String),
    MissingApiKey {
        provider: String,
        endpoint: String,
        quota_reset: Option<String>,
    },
    InvalidApiKey {
        provider: String,
        endpoint: String,
        quota_reset: Option<String>,
    },
    QuotaExceeded {
        provider: String,
        endpoint: String,
        quota_reset: Option<String>,
    },
    UnsupportedModel {
        provider: String,
        model: String,
        supported_models: Vec<String>,
    },
    ApiError {
        provider: String,
        endpoint: String,
        status: u16,
        message: String,
    },
    RequestError {
        status: StatusCode,
        message: String,
        details: Option<String>,
    },
}

impl fmt::Display for AiNeedError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            AiNeedError::IoError(err) => write!(f, "IO error: {}", err),
            AiNeedError::ConfigError(msg) => write!(f, "Configuration error: {}", msg),
            AiNeedError::MissingApiKey { provider, endpoint, quota_reset } => {
                write!(f, "Missing API key for {} ({})", provider, endpoint)?;
                if let Some(reset) = quota_reset {
                    write!(f, " - Quota resets at {}", reset)?;
                }
                Ok(())
            },
            AiNeedError::InvalidApiKey { provider, endpoint, quota_reset } => {
                write!(f, "Invalid API key for {} ({})", provider, endpoint)?;
                if let Some(reset) = quota_reset {
                    write!(f, " - Quota resets at {}", reset)?;
                }
                Ok(())
            },
            AiNeedError::QuotaExceeded { provider, endpoint, quota_reset } => {
                write!(f, "Quota exceeded for {} ({})", provider, endpoint)?;
                if let Some(reset) = quota_reset {
                    write!(f, " - Quota resets at {}", reset)?;
                }
                Ok(())
            },
            AiNeedError::UnsupportedModel { provider, model, supported_models } => {
                write!(f, "Unsupported model '{}' for provider {}. Supported models: {}", 
                    model, provider, supported_models.join(", "))
            },
            AiNeedError::ApiError { provider, endpoint, status, message } => {
                write!(f, "API error from {} ({}): {} - {}", provider, endpoint, status, message)
            },
            AiNeedError::RequestError { status, message, details } => {
                if let Some(detail) = details {
                    write!(f, "Request error ({}): {} - {}", status, message, detail)
                } else {
                    write!(f, "Request error ({}): {}", status, message)
                }
            },
        }
    }
}

impl std::error::Error for AiNeedError {}

impl From<io::Error> for AiNeedError {
    fn from(err: io::Error) -> Self {
        AiNeedError::IoError(err)
    }
}