use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum QasmError {
#[error("Unsupported gate: {0}")]
UnsupportedGate(String),
#[error("Parse error at line {line}: {message}")]
ParseError {
line: usize,
message: String,
},
#[error("Undefined register: {0}")]
UndefinedRegister(String),
#[error("Qubit index {index} out of range for register '{register}' (size {size})")]
QubitIndexOutOfRange {
register: String,
index: usize,
size: usize,
},
#[error("Invalid parameter in gate '{gate}': {message}")]
InvalidParameter {
gate: String,
message: String,
},
#[error("Gate '{gate}' expects {expected} parameter(s), got {actual}")]
WrongParameterCount {
gate: String,
expected: usize,
actual: usize,
},
#[error("Gate '{gate}' expects {expected} qubit(s), got {actual}")]
WrongQubitCount {
gate: String,
expected: usize,
actual: usize,
},
#[error("Format error: {0}")]
FormatError(#[from] std::fmt::Error),
#[error("Circuit has no qubits")]
EmptyCircuit,
#[error("Cannot evaluate expression '{0}'")]
ExpressionError(String),
}
impl QasmError {
pub fn parse(line: usize, message: impl Into<String>) -> Self {
Self::ParseError {
line,
message: message.into(),
}
}
}