|
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