use std::path::PathBuf;
use console::style;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum CliError {
#[error("{0}")]
Library(#[from] crate::Error),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("File not found: {path}")]
FileNotFound {
path: PathBuf,
},
#[error("Invalid argument: {message}")]
InvalidArgument {
message: String,
},
#[error("Failed to load model from {path}: {reason}")]
ModelLoad {
path: PathBuf,
reason: String,
},
#[error("Corpus error: {message}")]
Corpus {
message: String,
},
#[error("Checkpoint error: {message}")]
Checkpoint {
message: String,
},
#[error("Training interrupted")]
Interrupted,
#[error("Training error: {message}")]
Training {
message: String,
},
#[error("I/O error: {message}")]
IoError {
message: String,
},
#[error("REPL error: {message}")]
Repl {
message: String,
},
#[error("Serialization error: {0}")]
Serialization(String),
#[error("Language detection error: {message}")]
LanguageDetection {
message: String,
},
#[error("Unsupported: {message}")]
Unsupported {
message: String,
},
}
pub type CliResult<T> = Result<T, CliError>;
impl CliError {
pub fn file_not_found(path: impl Into<PathBuf>) -> Self {
Self::FileNotFound { path: path.into() }
}
pub fn invalid_argument(message: impl Into<String>) -> Self {
Self::InvalidArgument {
message: message.into(),
}
}
pub fn model_load(path: impl Into<PathBuf>, reason: impl Into<String>) -> Self {
Self::ModelLoad {
path: path.into(),
reason: reason.into(),
}
}
pub fn corpus(message: impl Into<String>) -> Self {
Self::Corpus {
message: message.into(),
}
}
pub fn checkpoint(message: impl Into<String>) -> Self {
Self::Checkpoint {
message: message.into(),
}
}
pub fn repl(message: impl Into<String>) -> Self {
Self::Repl {
message: message.into(),
}
}
pub fn unsupported(message: impl Into<String>) -> Self {
Self::Unsupported {
message: message.into(),
}
}
pub fn training(message: impl Into<String>) -> Self {
Self::Training {
message: message.into(),
}
}
pub fn io(message: impl Into<String>) -> Self {
Self::IoError {
message: message.into(),
}
}
pub fn print_error(&self) {
eprintln!("{}: {}", style("error").red().bold(), self);
}
}
pub fn print_warning(message: &str) {
eprintln!("{}: {}", style("warning").yellow().bold(), message);
}
pub fn print_info(message: &str) {
eprintln!("{}: {}", style("info").blue().bold(), message);
}
pub fn print_success(message: &str) {
eprintln!("{}: {}", style("success").green().bold(), message);
}