lique_core 0.1.0

Core library for Lique
Documentation
use oq3_syntax::ast::{AstChildren, Stmt};

use crate::{lints, Diagnostic};

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum Rule {
    ConditionalWithoutMeasurement,
    DoubleMeasurement,
    OpAfterMeasurement,
    OversizedCircuit,
    UnmanipulatedQubit,
    UnmeasurableQubits,
}

impl From<&str> for Rule {
    fn from(s: &str) -> Self {
        match s {
            "conditional-without-measurement" => Rule::ConditionalWithoutMeasurement,
            "double-measurement" => Rule::DoubleMeasurement,
            "operation-after-measurement" => Rule::OpAfterMeasurement,
            "oversized-circuit" => Rule::OversizedCircuit,
            "unmanipulated-qubits" => Rule::UnmanipulatedQubit,
            "unmeasurable-qubits" => Rule::UnmeasurableQubits,
            _ => panic!("Unknown rule: {}", s),
        }
    }
}

impl From<Rule> for String {
    fn from(rule: Rule) -> String {
        match rule {
            Rule::ConditionalWithoutMeasurement => "ql-conditional-without-measurement".to_string(),
            Rule::DoubleMeasurement => "ql-double-measurement".to_string(),
            Rule::OpAfterMeasurement => "ql-operation-after-measurement".to_string(),
            Rule::OversizedCircuit => "ql-oversized-circuit".to_string(),
            Rule::UnmanipulatedQubit => "ql-constant-classic-bit".to_string(),
            Rule::UnmeasurableQubits => "ql-unmeasurable-qubits".to_string(),
        }
    }
}

impl Rule {
    pub fn all() -> Vec<Self> {
        vec![
            Rule::ConditionalWithoutMeasurement,
            Rule::DoubleMeasurement,
            Rule::OpAfterMeasurement,
            Rule::OversizedCircuit,
            Rule::UnmanipulatedQubit,
            Rule::UnmeasurableQubits,
        ]
    }

    pub fn lint(&self, stmts: AstChildren<Stmt>) -> Vec<Diagnostic> {
        match self {
            Rule::ConditionalWithoutMeasurement => {
                lints::conditional_without_measurement::lint_conditional_without_measurement(stmts)
            }
            Rule::DoubleMeasurement => lints::double_measurement::lint_double_measurement(stmts),
            Rule::OpAfterMeasurement => {
                lints::op_after_measurement::lint_op_after_measurement(stmts)
            }
            Rule::OversizedCircuit => lints::oversized_circuit::lint_oversized_circuit(stmts),
            Rule::UnmanipulatedQubit => {
                lints::unmanipulated_qubits::lint_unmanipulated_qubits(stmts)
            }
            Rule::UnmeasurableQubits => lints::unmeasurable_qubits::lint_unmeasurable_qubits(stmts),
        }
    }
}