Skip to content

Commit 624a697

Browse files
committed
Try to generate the protobuf package based on the OID before using the path
1 parent 63131d0 commit 624a697

File tree

1 file changed

+32
-6
lines changed

1 file changed

+32
-6
lines changed

asn1rs-model/src/gen/protobuf.rs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::gen::Generator;
2-
use crate::model::Definition;
3-
use crate::model::Model;
42
use crate::model::Protobuf;
53
use crate::model::ProtobufType;
4+
use crate::model::{Definition, ObjectIdentifierComponent};
5+
use crate::model::{Model, ObjectIdentifier};
66
use std::fmt::Error as FmtError;
77
use std::fmt::Write;
88

@@ -61,7 +61,11 @@ impl ProtobufDefGenerator {
6161

6262
pub fn append_header(target: &mut dyn Write, model: &Model<Protobuf>) -> Result<(), Error> {
6363
writeln!(target, "syntax = 'proto3';")?;
64-
writeln!(target, "package {};", Self::model_to_package(&model.name))?;
64+
writeln!(
65+
target,
66+
"package {};",
67+
Self::model_to_package(&model.name, model.oid.as_ref())
68+
)?;
6569
writeln!(target)?;
6670
Ok(())
6771
}
@@ -143,7 +147,10 @@ impl ProtobufDefGenerator {
143147
'outer: for import in &model.imports {
144148
for what in &import.what {
145149
if what.eq(name) {
146-
prefixed.push_str(&Self::model_to_package(&import.from));
150+
prefixed.push_str(&Self::model_to_package(
151+
&import.from,
152+
import.from_oid.as_ref(),
153+
));
147154
prefixed.push('.');
148155
break 'outer;
149156
}
@@ -214,8 +221,27 @@ impl ProtobufDefGenerator {
214221
out
215222
}
216223

217-
pub fn model_to_package(model: &str) -> String {
218-
Self::model_name(&model.replace("_", "."), '.')
224+
pub fn model_to_package(path: &str, oid: Option<&ObjectIdentifier>) -> String {
225+
if let Some(oid) = oid {
226+
oid.iter()
227+
.map(|oid| match oid {
228+
ObjectIdentifierComponent::NameForm(name)
229+
| ObjectIdentifierComponent::NameAndNumberForm(name, _) => {
230+
if name.chars().next().map_or(false, |c| !c.is_alphabetic()) {
231+
format!("_{}", name.replace('-', "_"))
232+
} else {
233+
name.replace('-', "_")
234+
}
235+
}
236+
ObjectIdentifierComponent::NumberForm(number) => {
237+
format!("_{}", number)
238+
}
239+
})
240+
.collect::<Vec<String>>()
241+
.join(".")
242+
} else {
243+
Self::model_name(&path.replace("_", "."), '.')
244+
}
219245
}
220246
}
221247

0 commit comments

Comments
 (0)