1 个不稳定版本
0.1.0 | 2022年3月18日 |
---|
#1963 在 解析器实现
25KB
612 行
法兰卡 IDL
基于 nom 的不完整的 Rust Franca IDL 解析器包。
参考
为什么选择 Rust
这个库的一个目标是可以生成类似于 capicxx-someip-tools 的 Rust SomeIP 绑定和客户端。显然,这可以通过 Xtend 和现有的生成器来实现,这显然提供了优势,即所有 Franca 解析都已处理完毕。由于这个原因,在 Rust 基于的 SOME/IP 实现用于鲁棒的汽车软件 中也选择了这种方法。此外,这还允许依赖于 common-api-runtime 的所有工作。因此,这应该是一个完全合理的方法。
在 Rust 中完成所有这些的优点应该是在 Rust 项目的构建时可以运行解析和代码生成,类似于 tonic-build。另一个机会是提供一个不带依赖项的静态可执行文件,用于生成代码。这应该会降低新开发者的门槛。总的来说,让我们看看结果如何。如果您需要稳定且经过验证的版本,您应该选择 franca_arc_tools。
用法
将其添加到您的 Cargo.toml
[dependencies]
franca = "0.1"
use franca::parser::f_model;
fn main() {
const INPUT: &str = "
package test
interface HelloWorld {
version { major 1 minor 0 }
method sayHello {
in {
String name
}
out {
String value_a
Double value_b
UInt32 value_c
}
}
}
";
let (_remaining, model) = f_model(INPUT).unwrap();
println!("{:#?}", model);
}
将打印
FModel {
name: "test",
imports: [],
interfaces: [
FInterface {
name: "HelloWorld",
comment: None,
version: Some(
FVersion {
major: 1,
minor: 0,
},
),
attributes: [],
methods: [
FMethod {
name: "sayHello",
comment: None,
fire_and_forget: None,
in_args: [
FArgument {
name: "name",
comment: None,
type: FTypeRef {
predefined: Some(
String,
),
},
array: None,
},
],
out_args: [
FArgument {
name: "value_a",
comment: None,
type: FTypeRef {
predefined: Some(
String,
),
},
array: None,
},
FArgument {
name: "value_b",
comment: None,
type: FTypeRef {
predefined: Some(
Double,
),
},
array: None,
},
FArgument {
name: "value_c",
comment: None,
type: FTypeRef {
predefined: Some(
UInt32,
),
},
array: None,
},
],
error_enum: None,
errors: None,
},
],
broadcasts: [],
},
],
type_collections: [],
}
依赖项
~1MB
~20K SLoC