use std::path::PathBuf;
#[derive(Debug, thiserror::Error)]
pub enum ForgeError {
#[error("No se encontrΓ³ 'forge.toml' en: {path}")]
ConfigNotFound { path: PathBuf },
#[error("Error al parsear 'forge.toml': {message}")]
ConfigParseError { message: String },
#[error("Campo requerido '{field}' no encontrado en forge.toml")]
ConfigMissingField { field: String },
#[error("Lenguaje no soportado: '{lang}'. Usa: java, kotlin, python")]
UnsupportedLanguage { lang: String },
#[error("Dependencia circular detectada: {cycle}")]
CyclicDependency { cycle: String },
#[error("Tarea no encontrada: '{task_name}'")]
TaskNotFound { task_name: String },
#[error("La tarea '{task_name}' fallΓ³ con cΓ³digo de salida: {exit_code}")]
TaskFailed { task_name: String, exit_code: i32 },
#[error("Comando no encontrado: '{command}'. ΒΏEstΓ‘ instalado y en el PATH?")]
CommandNotFound { command: String },
#[error("Timeout al ejecutar la tarea '{task_name}' despuΓ©s de {seconds}s")]
TaskTimeout { task_name: String, seconds: u64 },
#[error("No se pudo resolver la dependencia: '{dependency}'")]
DependencyResolutionFailed { dependency: String },
#[error("Error al descargar '{url}': {message}")]
DownloadError { url: String, message: String },
#[error("Error de E/S en '{path}': {message}")]
IoError { path: PathBuf, message: String },
#[error("CachΓ© corrupta en '{path}'. Ejecuta 'forge clean' para regenerar.")]
CacheCorrupted { path: PathBuf },
}
impl ForgeError {
pub fn suggestion(&self) -> &'static str {
match self {
Self::ConfigNotFound { .. } => {
"π‘ Ejecuta 'forge init <lang>' para crear un forge.toml, o verifica que estΓ‘s en el directorio correcto."
}
Self::ConfigParseError { .. } => {
"π‘ Verifica la sintaxis TOML de tu forge.toml. Usa un validador como https://www.toml-lint.com/"
}
Self::ConfigMissingField { field, .. } => {
match field.as_str() {
"name" => "π‘ AΓ±ade 'name = \"mi-proyecto\"' en la secciΓ³n [project] de forge.toml",
"lang" => "π‘ AΓ±ade 'lang = \"java\"' (o kotlin/python) en la secciΓ³n [project] de forge.toml",
_ => "π‘ Revisa la documentaciΓ³n: https://github.com/enri312/forge#configuraciΓ³n",
}
}
Self::UnsupportedLanguage { .. } => {
"π‘ FORGE soporta: java, kotlin, python. Verifica el campo 'lang' en [project]"
}
Self::CyclicDependency { .. } => {
"π‘ Revisa las secciones [tasks.*.depends-on] en tu forge.toml para romper el ciclo"
}
Self::TaskNotFound { .. } => {
"π‘ Lista las tareas disponibles con 'forge info' o revisa la secciΓ³n [tasks] de forge.toml"
}
Self::TaskFailed { .. } => {
"π‘ Revisa la salida del compilador arriba. Usa 'forge build --verbose' para mΓ‘s detalle"
}
Self::CommandNotFound { command, .. } => {
match command.as_str() {
"javac" | "java" => "π‘ Instala JDK 17+: https://adoptium.net/ y asegΓΊrate que 'javac' estΓ‘ en PATH",
"kotlinc" => "π‘ Instala Kotlin: https://kotlinlang.org/docs/command-line.html",
"python" | "python3" | "pip" => "π‘ Instala Python 3.12+: https://www.python.org/downloads/",
"pytest" => "π‘ Instala pytest: pip install pytest",
_ => "π‘ Verifica que el comando estΓ‘ instalado y accesible en tu PATH del sistema",
}
}
Self::TaskTimeout { .. } => {
"π‘ Considera aumentar el timeout o dividir la tarea en sub-tareas mΓ‘s pequeΓ±as"
}
Self::DependencyResolutionFailed { .. } => {
"π‘ Verifica el formato en [dependencies]: \"groupId:artifactId\" = \"versiΓ³n\". Ejemplo: \"com.google.gson:gson\" = \"2.11.0\""
}
Self::DownloadError { .. } => {
"π‘ Verifica tu conexiΓ³n a internet y que la dependencia exista en Maven Central / PyPI"
}
Self::IoError { .. } => {
"π‘ Verifica permisos de escritura en el directorio del proyecto y espacio disponible en disco"
}
Self::CacheCorrupted { .. } => {
"π‘ Ejecuta 'forge clean' para eliminar la cachΓ© y reconstruir desde cero"
}
}
}
}
pub type ForgeResult<T> = anyhow::Result<T>;