refactor: modularize CLI and optimize cache metadata lookups

- Extract error handling, path validation, and handlers into separate modules
- Add CacheCheckResult to pre-fetch metadata and avoid double lookups
- Deprecate legacy cache methods in favor of optimized alternatives
- Enable tokio fs feature for async file operations
- Remove debug profile from release build
This commit is contained in:
2026-01-08 23:18:39 +05:30
parent eb5db4f4e6
commit eeb07983cb
13 changed files with 443 additions and 360 deletions

79
src/cli/errors.rs Normal file
View File

@@ -0,0 +1,79 @@
use colored::*;
pub fn handle_gemini_error(error: crate::gemini::GeminiError) {
match error {
crate::gemini::GeminiError::RateLimitExceeded { retry_after } => {
println!(
"{} API rate limit exceeded. Please wait {} seconds before trying again.",
"ERROR:".red(),
retry_after
);
}
crate::gemini::GeminiError::QuotaExceeded { limit } => {
println!(
"{} Quota exceeded: {}. Please check your Gemini API usage.",
"ERROR:".red(),
limit
);
}
crate::gemini::GeminiError::ModelNotFound { model } => {
println!(
"{} Model '{}' not found. Please check the model name in the configuration.",
"ERROR:".red(),
model
);
}
crate::gemini::GeminiError::InvalidApiKey => {
println!(
"{} Invalid API key. Please check your GEMINI_API_KEY environment variable.",
"ERROR:".red()
);
}
crate::gemini::GeminiError::ContentPolicyViolation { reason } => {
println!("{} Content policy violation: {}", "ERROR:".red(), reason);
}
crate::gemini::GeminiError::ServiceUnavailable { reason } => {
println!(
"{} Gemini service is temporarily unavailable: {}",
"ERROR:".red(),
reason
);
}
crate::gemini::GeminiError::NetworkError(e) => {
println!("{} Network error: {}", "ERROR:".red(), e);
}
crate::gemini::GeminiError::Timeout { seconds } => {
println!(
"{} Request timed out after {} seconds.",
"ERROR:".red(),
seconds
);
}
crate::gemini::GeminiError::InvalidRequest { details } => {
println!("{} Invalid request: {}", "ERROR:".red(), details);
}
crate::gemini::GeminiError::ApiError { status, message } => {
println!(
"{} API error (HTTP {}): {}",
"ERROR:".red(),
status,
message
);
}
crate::gemini::GeminiError::InvalidResponse(msg) => {
println!("{} Invalid response from Gemini: {}", "ERROR:".red(), msg);
}
crate::gemini::GeminiError::InternalError { details } => {
println!("{} Internal server error: {}", "ERROR:".red(), details);
}
crate::gemini::GeminiError::SerializationError(e) => {
println!("{} JSON serialization error: {}", "ERROR:".red(), e);
}
}
println!("\n{} Check the following:", "HINT:".yellow());
println!(" - Your GEMINI_API_KEY is correctly set");
println!(" - Your internet connection is working");
println!(" - Gemini API service is available");
println!(" - You haven't exceeded your API quota");
}