use thiserror::Error;
#[derive(Error, Debug)]
pub enum OAuthError {
#[error("PKCE challenge not initialized. Call generate_auth_url() first.")]
PkceNotInitialized,
#[error("Token exchange failed: {0}")]
TokenExchangeFailed(String),
#[error("Token refresh failed: {0}")]
TokenRefreshFailed(String),
#[error("Failed to create API key from OAuth tokens")]
ApiKeyCreationFailed,
#[error("Unknown authentication method: {0}")]
UnknownMethod(String),
#[error("Invalid header value")]
InvalidHeader,
#[error("HTTP error: {0}")]
HttpError(#[from] reqwest::Error),
#[error("JSON parse error: {0}")]
JsonError(#[from] serde_json::Error),
#[error("Parse error: {0}")]
ParseError(String),
#[error("Invalid authorization code format: {0}")]
InvalidCodeFormat(String),
#[error("Provider not found: {0}")]
ProviderNotFound(String),
#[error("OAuth not supported for this authentication method")]
OAuthNotSupported,
#[error("File I/O error: {0}")]
IoError(#[from] std::io::Error),
#[error("TOML serialization error: {0}")]
TomlSerError(#[from] toml::ser::Error),
#[error("TOML deserialization error: {0}")]
TomlDeError(#[from] toml::de::Error),
#[error("Authentication required. Run 'stakpak auth login' to authenticate.")]
AuthRequired,
#[error("Token expired. Please re-authenticate with 'stakpak auth login'.")]
TokenExpired,
}
impl OAuthError {
pub fn token_exchange_failed(msg: impl Into<String>) -> Self {
Self::TokenExchangeFailed(msg.into())
}
pub fn token_refresh_failed(msg: impl Into<String>) -> Self {
Self::TokenRefreshFailed(msg.into())
}
pub fn parse_error(msg: impl Into<String>) -> Self {
Self::ParseError(msg.into())
}
pub fn invalid_code_format(msg: impl Into<String>) -> Self {
Self::InvalidCodeFormat(msg.into())
}
pub fn provider_not_found(provider: impl Into<String>) -> Self {
Self::ProviderNotFound(provider.into())
}
pub fn unknown_method(method: impl Into<String>) -> Self {
Self::UnknownMethod(method.into())
}
}
pub type OAuthResult<T> = Result<T, OAuthError>;