aptu_core/error.rs
1// SPDX-License-Identifier: Apache-2.0
2
3//! Error types for the Aptu CLI.
4//!
5//! Uses `thiserror` for deriving `std::error::Error` implementations.
6//! Application code should use `anyhow::Result` for top-level error handling.
7
8use thiserror::Error;
9
10/// Errors that can occur during Aptu operations.
11#[derive(Error, Debug)]
12pub enum AptuError {
13 /// GitHub API error from octocrab.
14 #[error("GitHub API error: {0}")]
15 GitHub(#[from] octocrab::Error),
16
17 /// AI provider error (`OpenRouter`, Ollama, etc.).
18 #[error("AI provider error: {message}")]
19 AI {
20 /// Error message from the AI provider.
21 message: String,
22 /// Optional HTTP status code from the provider.
23 status: Option<u16>,
24 },
25
26 /// User is not authenticated - needs to run `aptu auth login`.
27 #[error("Authentication required - run `aptu auth login` first")]
28 NotAuthenticated,
29
30 /// Rate limit exceeded from an AI provider.
31 #[error("Rate limit exceeded on {provider}, retry after {retry_after}s")]
32 RateLimited {
33 /// Name of the provider that rate limited (e.g., `OpenRouter`).
34 provider: String,
35 /// Number of seconds to wait before retrying.
36 retry_after: u64,
37 },
38
39 /// Configuration file error.
40 #[error("Configuration error: {0}")]
41 Config(#[from] config::ConfigError),
42
43 /// Invalid JSON response from AI provider.
44 #[error("Invalid JSON response from AI")]
45 InvalidAIResponse(#[source] serde_json::Error),
46
47 /// Network/HTTP error from reqwest.
48 #[error("Network error: {0}")]
49 Network(#[from] reqwest::Error),
50
51 /// Keyring/credential storage error.
52 #[error("Keyring error: {0}")]
53 Keyring(#[from] keyring::Error),
54
55 /// Circuit breaker is open - AI provider is unavailable.
56 #[error("Circuit breaker is open - AI provider is temporarily unavailable")]
57 CircuitOpen,
58}