use super::common::{Ident, NamedNumber, QuotedString};
use super::oid::OidComponent;
use crate::types::{Access, AccessKeyword, Span, Status};
#[derive(Debug, PartialEq, Eq)]
pub struct SyntaxClause {
pub syntax: TypeSyntax,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub enum TypeSyntax {
TypeRef(Ident),
IntegerEnum {
base: Option<Ident>,
named_numbers: Vec<NamedNumber>,
span: Span,
},
Bits {
named_bits: Vec<NamedNumber>,
span: Span,
},
Constrained {
base: Box<TypeSyntax>,
constraint: Constraint,
span: Span,
},
SequenceOf { entry_type: Ident, span: Span },
Sequence {
fields: Vec<SequenceField>,
span: Span,
},
Choice {
alternatives: Vec<SequenceField>,
span: Span,
},
Tagged {
underlying: Box<TypeSyntax>,
span: Span,
},
OctetString { span: Span },
ObjectIdentifier { span: Span },
}
impl TypeSyntax {
pub fn span(&self) -> Span {
match self {
TypeSyntax::TypeRef(ident) => ident.span,
TypeSyntax::IntegerEnum { span, .. }
| TypeSyntax::Bits { span, .. }
| TypeSyntax::Constrained { span, .. }
| TypeSyntax::SequenceOf { span, .. }
| TypeSyntax::Sequence { span, .. }
| TypeSyntax::Choice { span, .. }
| TypeSyntax::Tagged { span, .. }
| TypeSyntax::OctetString { span }
| TypeSyntax::ObjectIdentifier { span } => *span,
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct SequenceField {
pub name: Ident,
pub syntax: TypeSyntax,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub enum Constraint {
Size { ranges: Vec<Range>, span: Span },
Range { ranges: Vec<Range>, span: Span },
}
impl Constraint {
pub fn span(&self) -> Span {
match self {
Constraint::Size { span, .. } | Constraint::Range { span, .. } => *span,
}
}
}
#[derive(Debug, PartialEq, Eq)]
pub struct Range {
pub min: RangeValue,
pub max: Option<RangeValue>,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub enum RangeValue {
Signed(i64),
Unsigned(u64),
Named(Ident),
}
#[derive(Debug, PartialEq, Eq)]
pub struct AccessClause {
pub keyword: AccessKeyword,
pub value: Access,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub struct StatusClause {
pub value: Status,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub struct IndexClause {
pub items: Vec<IndexItem>,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub struct IndexItem {
pub implied: bool,
pub object: Ident,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub struct AugmentsClause {
pub target: Ident,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub struct DefValClause {
pub value: DefVal,
pub span: Span,
}
#[derive(Debug, PartialEq, Eq)]
pub enum DefVal {
Integer(i64),
Unsigned(u64),
String(QuotedString),
Identifier(Ident),
Bits { labels: Vec<Ident>, span: Span },
HexString { content: String, span: Span },
BinaryString { content: String, span: Span },
ObjectIdentifier {
components: Vec<OidComponent>,
span: Span,
},
Unparsed { span: Span },
}
#[derive(Debug, PartialEq, Eq)]
pub struct RevisionClause {
pub date: QuotedString,
pub description: QuotedString,
pub span: Span,
}