|
1 | 1 | use crate::gen::Generator;
|
2 |
| -use crate::model::Definition; |
3 |
| -use crate::model::Model; |
4 | 2 | use crate::model::Protobuf;
|
5 | 3 | use crate::model::ProtobufType;
|
| 4 | +use crate::model::{Definition, ObjectIdentifierComponent}; |
| 5 | +use crate::model::{Model, ObjectIdentifier}; |
6 | 6 | use std::fmt::Error as FmtError;
|
7 | 7 | use std::fmt::Write;
|
8 | 8 |
|
@@ -61,7 +61,11 @@ impl ProtobufDefGenerator {
|
61 | 61 |
|
62 | 62 | pub fn append_header(target: &mut dyn Write, model: &Model<Protobuf>) -> Result<(), Error> {
|
63 | 63 | 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 | + )?; |
65 | 69 | writeln!(target)?;
|
66 | 70 | Ok(())
|
67 | 71 | }
|
@@ -143,7 +147,10 @@ impl ProtobufDefGenerator {
|
143 | 147 | 'outer: for import in &model.imports {
|
144 | 148 | for what in &import.what {
|
145 | 149 | 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 | + )); |
147 | 154 | prefixed.push('.');
|
148 | 155 | break 'outer;
|
149 | 156 | }
|
@@ -214,8 +221,27 @@ impl ProtobufDefGenerator {
|
214 | 221 | out
|
215 | 222 | }
|
216 | 223 |
|
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 | + } |
219 | 245 | }
|
220 | 246 | }
|
221 | 247 |
|
|
0 commit comments