use thiserror::Error;
#[derive(Debug, Error, Clone, PartialEq)]
pub enum PrismError {
#[error("parse error at line {line}: {message}")]
Parse { line: usize, message: String },
#[error("unsupported construct at line {line}: `{construct}`")]
UnsupportedConstruct { construct: String, line: usize },
#[error("invalid qubit index {index} (register size: {register_size})")]
InvalidQubit { index: usize, register_size: usize },
#[error("invalid classical bit index {index} (register size: {register_size})")]
InvalidClassicalBit { index: usize, register_size: usize },
#[error("gate `{gate}`: expected {expected} qubit(s), got {got}")]
GateArity {
gate: String,
expected: usize,
got: usize,
},
#[error("backend `{backend}` does not support: {operation}")]
BackendUnsupported { backend: String, operation: String },
#[error("invalid parameter: {message}")]
InvalidParameter { message: String },
#[error("undefined register `{name}` at line {line}")]
UndefinedRegister { name: String, line: usize },
#[error("backend `{backend}` is incompatible: {reason}")]
IncompatibleBackend { backend: String, reason: String },
}
pub type Result<T> = std::result::Result<T, PrismError>;