mib-rs 0.10.0

SNMP MIB parser and resolver
Documentation
//! IR types for OID assignments and their components.
//!
//! These mirror [`crate::ast::oid`] but use `String` names instead of
//! [`Ident`](crate::ast::Ident) nodes.

use crate::source::SourceRange;

/// An unresolved OID assignment. Components remain as symbolic references
/// until the resolver phase.
#[derive(Debug, Clone)]
pub struct OidAssignment {
    /// Ordered list of OID components (symbolic or numeric).
    pub components: Vec<OidComponent>,
    /// Source-qualified range covering the entire `{ ... }` assignment.
    pub range: SourceRange,
}

/// A single element of an OID assignment.
#[derive(Debug, Clone)]
pub enum OidComponent {
    /// Symbolic name reference, e.g. `internet`.
    Name {
        name: String,
        /// Source-qualified range covering the symbolic name.
        range: SourceRange,
    },
    /// Numeric arc, e.g. `1` or `31`.
    Number {
        value: u32,
        /// Source-qualified range covering the numeric literal.
        range: SourceRange,
    },
    /// Name with number, e.g. `org(3)`.
    NamedNumber {
        name: String,
        number: u32,
        /// Source-qualified range covering `name` but not the numeric annotation.
        name_range: SourceRange,
        /// Source-qualified range covering `name(number)`.
        range: SourceRange,
    },
    /// Module-qualified reference, e.g. `SNMPv2-SMI.enterprises`.
    QualifiedName {
        module: String,
        name: String,
        /// Source-qualified range covering `module.name`.
        range: SourceRange,
    },
    /// Module-qualified name with number, e.g. `SNMPv2-SMI.enterprises(1)`.
    QualifiedNamedNumber {
        module: String,
        name: String,
        number: u32,
        /// Source-qualified range covering `module.name` but not the numeric annotation.
        name_range: SourceRange,
        /// Source-qualified range covering `module.name(number)`.
        range: SourceRange,
    },
}

impl OidComponent {
    /// Returns the source-qualified range covering this component.
    pub fn range(&self) -> SourceRange {
        match self {
            OidComponent::Name { range, .. }
            | OidComponent::Number { range, .. }
            | OidComponent::NamedNumber { range, .. }
            | OidComponent::QualifiedName { range, .. }
            | OidComponent::QualifiedNamedNumber { range, .. } => *range,
        }
    }
}