OMG IDLv4 to Rust code generator
A tool reading OMG IDLv4 and generating corresponding Rust data types and code.
Usage:
omg-idl-gen -I <include-dir> data.idl -o output.rs
Rust Version Requirements
1.84.1
OMG IDLv4 to Rust Mapping
The IDL types are mapped onto Rust as follows.
If a type-mapping has not been decided, it is marked with 'NA'.
As RTPS is a data-centric framework in contrast to
the the original OO background, the focus is put onto data structures, and ignoring interfaces and structures so far.
| IDL-Type | Rust-Type |
|---|---|
| module | module |
| boolean | bool |
| char/wchar | char |
| octet | u8 |
| string/wstring | std::string::String |
| short | i16 |
| long | i32 |
| long long | i64 |
| unsigned short | u16 |
| unsigned long | u32 |
| unsigned long long | u64 |
| float | f32 |
| double | f64 |
| fixed | NA |
| enum | enum |
| union | enum |
| struct | struct |
| sequence | std::vec::Vec |
| array, eg. 'T a[N]' | native array '[T;N]' |
| interface (non abstract) | NA |
| interface (abstract) | NA |
| constant (not within interface) | const |
| constant (within an interface) | NA |
| exception | std::result::Result |
| Any | NA |
| type declarations nested within interfaces | NA |
| typedef | type |
| pseudo objects | NA |
| readonly attribute | NA |
| readwrite attribute | NA |
| operation | NA |
Mapping by examples
Templates
| IDL | Rust |
|---|---|
sequence<octet> |
std::vec::Vec<u8> |
Typedef
| IDL | Rust |
|---|---|
| typedef long Foo; | pub type Foo = i32; |
| typedef short Foo[2]; | pub type Foo = [i16;2] |
| typedef short Foo[2][3]; | pub type Foo = [[i16; 2]; 3] |
| typedef sequence Foo; | pub type Foo = std::vec::Vec |
Struct
| IDL | Rust |
|---|---|
| struct Foo { long l; short s;}; | pub struct Foo { pub l: i32, pub s: i16;} |
Enum
| IDL | Rust |
|---|---|
| enum Foo { VARIANT0, VARIANT1, VARIANT2 }; | pub enum Foo { VARIANT0, VARIANT1, VARIANT2, } |
Union Switch
Note: Only switch types "switch (long)" is supported yet.
| IDL | Rust |
|---|---|
| union Foo switch (long) { case LABEL0: long l; case LABEL1: case LABEL2: short s; default: octet o[8];}; | pub enum Foo { LABEL0{l: i32}, LABEL2{s: i16}, LABEL1{s: i16}, default{o: [u8; 8]},} |
| /* not yet, to be developed */union Result switch (long) { case None: void _dummy; case Some: T t}; | /* not yet, to be developed */pub enum Result<T> { None, Some(T),} |
| ** |
Known Issues
The current implementation does not have a way to determine if an array is too large for the serde library to handle it natively. If this occurs in your environment, it's recommended to add the following trait to your array.
License
Credit
The code underlying this repo was originally born in rtps-gen under the effort of Frank Rehberger. The original implementation has been updated to utilize Jinja templating, newer Rust standards, and reduced heap usage. The baselines will continue to diverage over time.