use thiserror::Error;
pub(crate) const MAX_PROJECT_NAME_LENGTH: usize = 64;
#[derive(Debug, Error)]
pub enum GeneratorError {
#[error("Project name validation failed: {0}")]
InvalidProjectName(String),
#[error("Project name cannot be empty")]
EmptyProjectName,
#[error(
"Project name exceeds maximum length of {} characters",
MAX_PROJECT_NAME_LENGTH
)]
ProjectNameTooLong,
#[error("Project name contains invalid characters. Use only alphanumeric, underscore, hyphen, and dot")]
InvalidProjectNameCharacters,
#[error("Project name contains invalid pattern")]
InvalidProjectNamePattern,
#[error("Project name cannot contain path separators")]
ProjectNamePathSeparator,
#[error("Template directory '{}' not found", .0.display())]
TemplateNotFound(std::path::PathBuf),
#[error("Template '{}' not found", .0)]
TemplateFileNotFound(String),
#[error("Output path escapes current directory: {}", .0.display())]
PathTraversal(std::path::PathBuf),
#[error("Invalid output path: {}", .0)]
InvalidOutputPath(String),
#[error("Failed to get current directory: {}", .0)]
CurrentDirError(String),
#[error("Directory '{}' already exists", .0)]
DirectoryExists(String),
#[error("Failed to create project directory: {}", .0.display())]
CreateDirectoryError(std::path::PathBuf),
#[error("Template '{}' contains dangerous pattern: {}", .0, .1)]
DangerousTemplate(String, String),
#[error("Failed to render template '{}': {}", .0, .1)]
TemplateRenderError(String, String),
#[error("Failed to write output file '{}': {}", .0.display(), .1)]
WriteFileError(std::path::PathBuf, String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
}
pub type GeneratorResult<T> = Result<T, GeneratorError>;