Skip to content

Commit 1d524c8

Browse files
authored
Merge pull request #199 from Rawk/rasn-generate-type
refactor(rasn-generator): Move out `generate_type` from `generate_tld`
2 parents 3cc8665 + e18f3f7 commit 1d524c8

File tree

2 files changed

+68
-72
lines changed

2 files changed

+68
-72
lines changed

rasn-compiler/src/generator/rasn/builder.rs

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -44,45 +44,7 @@ impl Rasn {
4444
tld: ToplevelDefinition,
4545
) -> Result<TokenStream, GeneratorError> {
4646
match tld {
47-
ToplevelDefinition::Type(t) => {
48-
if t.parameterization.is_some() {
49-
return Ok(TokenStream::new());
50-
}
51-
match t.ty {
52-
ASN1Type::Null => self.generate_null(t),
53-
ASN1Type::Boolean(_) => self.generate_boolean(t),
54-
ASN1Type::Integer(_) => self.generate_integer(t),
55-
ASN1Type::Enumerated(_) => self.generate_enumerated(t),
56-
ASN1Type::BitString(_) => self.generate_bit_string(t),
57-
ASN1Type::CharacterString(_) => self.generate_character_string(t),
58-
ASN1Type::Sequence(_) | ASN1Type::Set(_) => self.generate_sequence_or_set(t),
59-
ASN1Type::SequenceOf(_) | ASN1Type::SetOf(_) => {
60-
self.generate_sequence_or_set_of(t)
61-
}
62-
ASN1Type::ElsewhereDeclaredType(_) => self.generate_typealias(t),
63-
ASN1Type::Choice(_) => self.generate_choice(t),
64-
ASN1Type::OctetString(_) => self.generate_octet_string(t),
65-
ASN1Type::Time(_) => unimplemented!("rasn does not support TIME types yet!"),
66-
ASN1Type::Real(_) => Err(GeneratorError {
67-
kind: GeneratorErrorType::NotYetInplemented,
68-
details: "Real types are currently unsupported!".into(),
69-
top_level_declaration: None,
70-
}),
71-
ASN1Type::ObjectIdentifier(_) => self.generate_oid(t),
72-
ASN1Type::ObjectClassField(_) | ASN1Type::EmbeddedPdv | ASN1Type::External => {
73-
self.generate_any(t)
74-
}
75-
ASN1Type::GeneralizedTime(_) => self.generate_generalized_time(t),
76-
ASN1Type::UTCTime(_) => self.generate_utc_time(t),
77-
ASN1Type::Any => self.generate_any(t),
78-
ASN1Type::ChoiceSelectionType(_) => Err(GeneratorError {
79-
kind: GeneratorErrorType::Asn1TypeMismatch,
80-
details: "Choice selection type should have been resolved at this point!"
81-
.into(),
82-
top_level_declaration: None,
83-
}),
84-
}
85-
}
47+
ToplevelDefinition::Type(t) => self.generate_type(t),
8648
ToplevelDefinition::Value(v) => self.generate_value(v),
8749
ToplevelDefinition::Class(_) => Ok(TokenStream::new()),
8850
ToplevelDefinition::Object(o) => match o.value {
@@ -97,6 +59,46 @@ impl Rasn {
9759
}
9860
}
9961

62+
pub(crate) fn generate_type(
63+
&self,
64+
tld: ToplevelTypeDefinition,
65+
) -> Result<TokenStream, GeneratorError> {
66+
if tld.parameterization.is_some() {
67+
return Ok(TokenStream::new());
68+
}
69+
match tld.ty {
70+
ASN1Type::Null => self.generate_null(tld),
71+
ASN1Type::Boolean(_) => self.generate_boolean(tld),
72+
ASN1Type::Integer(_) => self.generate_integer(tld),
73+
ASN1Type::Enumerated(_) => self.generate_enumerated(tld),
74+
ASN1Type::BitString(_) => self.generate_bit_string(tld),
75+
ASN1Type::CharacterString(_) => self.generate_character_string(tld),
76+
ASN1Type::Sequence(_) | ASN1Type::Set(_) => self.generate_sequence_or_set(tld),
77+
ASN1Type::SequenceOf(_) | ASN1Type::SetOf(_) => self.generate_sequence_or_set_of(tld),
78+
ASN1Type::ElsewhereDeclaredType(_) => self.generate_typealias(tld),
79+
ASN1Type::Choice(_) => self.generate_choice(tld),
80+
ASN1Type::OctetString(_) => self.generate_octet_string(tld),
81+
ASN1Type::Time(_) => unimplemented!("rasn does not support TIME types yet!"),
82+
ASN1Type::Real(_) => Err(GeneratorError {
83+
kind: GeneratorErrorType::NotYetInplemented,
84+
details: "Real types are currently unsupported!".into(),
85+
top_level_declaration: None,
86+
}),
87+
ASN1Type::ObjectIdentifier(_) => self.generate_oid(tld),
88+
ASN1Type::ObjectClassField(_) | ASN1Type::EmbeddedPdv | ASN1Type::External => {
89+
self.generate_any(tld)
90+
}
91+
ASN1Type::GeneralizedTime(_) => self.generate_generalized_time(tld),
92+
ASN1Type::UTCTime(_) => self.generate_utc_time(tld),
93+
ASN1Type::Any => self.generate_any(tld),
94+
ASN1Type::ChoiceSelectionType(_) => Err(GeneratorError {
95+
kind: GeneratorErrorType::Asn1TypeMismatch,
96+
details: "Choice selection type should have been resolved at this point!".into(),
97+
top_level_declaration: None,
98+
}),
99+
}
100+
}
101+
100102
pub(crate) fn generate_typealias(
101103
&self,
102104
tld: ToplevelTypeDefinition,
@@ -807,19 +809,17 @@ impl Rasn {
807809
let name = self.to_rust_title_case(&tld.name);
808810
let anonymous_item = match seq_or_set_of.element_type.as_ref() {
809811
ASN1Type::ElsewhereDeclaredType(_) => None,
810-
n => Some(
811-
self.generate_tld(ToplevelDefinition::Type(ToplevelTypeDefinition {
812-
parameterization: None,
813-
comments: format!(
814-
" Anonymous {} OF member ",
815-
if is_set_of { "SET" } else { "SEQUENCE" }
816-
),
817-
name: String::from(INNER_ARRAY_LIKE_PREFIX) + &name.to_string(),
818-
ty: n.clone(),
819-
tag: None,
820-
module_header: None,
821-
}))?,
822-
),
812+
n => Some(self.generate_type(ToplevelTypeDefinition {
813+
parameterization: None,
814+
comments: format!(
815+
" Anonymous {} OF member ",
816+
if is_set_of { "SET" } else { "SEQUENCE" }
817+
),
818+
name: String::from(INNER_ARRAY_LIKE_PREFIX) + &name.to_string(),
819+
ty: n.clone(),
820+
tag: None,
821+
module_header: None,
822+
})?),
823823
}
824824
.unwrap_or_default();
825825
let member_type = match seq_or_set_of.element_type.as_ref() {

rasn-compiler/src/generator/rasn/utils.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -329,16 +329,14 @@ impl Rasn {
329329
FormattedMembers::default(),
330330
|mut acc, (i, m)| {
331331
let nested = if Self::needs_unnesting(&m.ty) {
332-
Some(
333-
self.generate_tld(ToplevelDefinition::Type(ToplevelTypeDefinition {
334-
parameterization: None,
335-
comments: INNER_TYPE_COMMENT.into(),
336-
name: self.inner_name(&m.name, parent_name).to_string(),
337-
ty: m.ty.clone(),
338-
tag: None,
339-
module_header: None,
340-
})),
341-
)
332+
Some(self.generate_type(ToplevelTypeDefinition {
333+
parameterization: None,
334+
comments: INNER_TYPE_COMMENT.into(),
335+
name: self.inner_name(&m.name, parent_name).to_string(),
336+
ty: m.ty.clone(),
337+
tag: None,
338+
module_header: None,
339+
}))
342340
.transpose()
343341
} else {
344342
Ok(None)
@@ -422,16 +420,14 @@ impl Rasn {
422420
FormattedOptions::default(),
423421
|mut acc, (i, o)| {
424422
let nested = if Self::needs_unnesting(&o.ty) {
425-
Some(
426-
self.generate_tld(ToplevelDefinition::Type(ToplevelTypeDefinition {
427-
parameterization: None,
428-
comments: INNER_TYPE_COMMENT.into(),
429-
name: self.inner_name(&o.name, parent_name).to_string(),
430-
ty: o.ty.clone(),
431-
tag: None,
432-
module_header: None,
433-
})),
434-
)
423+
Some(self.generate_type(ToplevelTypeDefinition {
424+
parameterization: None,
425+
comments: INNER_TYPE_COMMENT.into(),
426+
name: self.inner_name(&o.name, parent_name).to_string(),
427+
ty: o.ty.clone(),
428+
tag: None,
429+
module_header: None,
430+
}))
435431
.transpose()
436432
} else {
437433
Ok(None)

0 commit comments

Comments
 (0)