use crate::source::SourceRange;
use super::oid::OidComponent;
#[derive(Debug, Clone)]
pub enum TypeSyntax {
TypeRef {
name: String,
range: SourceRange,
},
IntegerEnum {
base: String,
base_range: Option<SourceRange>,
named_numbers: Vec<NamedNumber>,
range: SourceRange,
},
Bits {
named_bits: Vec<NamedBit>,
range: SourceRange,
},
Constrained {
base: Box<TypeSyntax>,
constraint: Constraint,
range: SourceRange,
},
SequenceOf {
entry_type: String,
entry_type_range: SourceRange,
range: SourceRange,
},
Sequence {
fields: Vec<SequenceField>,
range: SourceRange,
},
OctetString {
range: SourceRange,
},
ObjectIdentifier {
range: SourceRange,
},
}
impl TypeSyntax {
pub fn range(&self) -> SourceRange {
match self {
TypeSyntax::TypeRef { range, .. }
| TypeSyntax::IntegerEnum { range, .. }
| TypeSyntax::Bits { range, .. }
| TypeSyntax::Constrained { range, .. }
| TypeSyntax::SequenceOf { range, .. }
| TypeSyntax::Sequence { range, .. }
| TypeSyntax::OctetString { range }
| TypeSyntax::ObjectIdentifier { range } => *range,
}
}
}
#[derive(Debug, Clone)]
pub struct NamedNumber {
pub name: String,
pub value: i64,
pub range: SourceRange,
}
#[derive(Debug, Clone)]
pub struct NamedBit {
pub name: String,
pub position: u32,
pub range: SourceRange,
}
#[derive(Debug, Clone)]
pub struct SequenceField {
pub name: String,
pub syntax: TypeSyntax,
pub range: SourceRange,
}
#[derive(Debug, Clone)]
pub enum Constraint {
Size {
ranges: Vec<Range>,
range: SourceRange,
},
Range {
ranges: Vec<Range>,
range: SourceRange,
},
}
impl Constraint {
pub fn range(&self) -> SourceRange {
match self {
Constraint::Size { range, .. } | Constraint::Range { range, .. } => *range,
}
}
}
#[derive(Debug, Clone)]
pub struct Range {
pub min: RangeValue,
pub max: Option<RangeValue>,
pub range: SourceRange,
}
#[derive(Debug, Clone)]
pub enum RangeValue {
Signed(i64),
Unsigned(u64),
Min,
Max,
Raw(String),
}
#[derive(Debug, Clone)]
pub enum DefVal {
Integer(i64),
Unsigned(u64),
String(String),
HexString(String),
BinaryString(String),
Enum(String),
Bits { labels: Vec<String> },
OidRef(String),
OidValue { components: Vec<OidComponent> },
Unparsed,
}