use thiserror::Error;
#[derive(Error, Debug, Clone, PartialEq)]
pub enum TemplateError {
#[error("no Value definitions found in template")]
NoValues,
#[error("duplicate Value name '{0}'")]
DuplicateValue(String),
#[error("invalid Value definition at line {line}: {message}")]
InvalidValue { line: usize, message: String },
#[error("invalid regex '{pattern}': {message}")]
InvalidRegex { pattern: String, message: String },
#[error("missing required 'Start' state")]
MissingStartState,
#[error("duplicate state name '{0}'")]
DuplicateState(String),
#[error("invalid state name '{name}': {reason}")]
InvalidStateName { name: String, reason: String },
#[error("state '{0}' referenced but not defined")]
UndefinedState(String),
#[error("non-empty 'End' state (must be empty)")]
NonEmptyEndState,
#[error("non-empty 'EOF' state (must be empty)")]
NonEmptyEofState,
#[error("invalid rule at line {line}: {message}")]
InvalidRule { line: usize, message: String },
#[error("'Continue' action cannot have state transition at line {0}")]
ContinueWithTransition(usize),
#[error("unknown option '{0}'")]
UnknownOption(String),
#[error("duplicate option '{0}'")]
DuplicateOption(String),
#[error("expected blank line after Value definitions at line {0}")]
ExpectedBlankLine(usize),
#[error("invalid variable substitution at line {line}: {message}")]
InvalidSubstitution { line: usize, message: String },
}
#[derive(Error, Debug, Clone, PartialEq)]
pub enum ParseError {
#[error("error triggered by rule at line {rule_line}: {message}")]
RuleError { rule_line: usize, message: String },
#[error("deserialization error: {0}")]
DeserializeError(String),
}
#[derive(Error, Debug)]
pub enum TextFsmError {
#[error(transparent)]
Template(#[from] TemplateError),
#[error(transparent)]
Parse(#[from] ParseError),
#[error(transparent)]
CliTable(#[from] crate::clitable::CliTableError),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}