#idl #automotive #ecu

franca

基于 nom 的不完整的 Rust Franca IDL 解析器包

1 个不稳定版本

0.1.0 2022年3月18日

#1963解析器实现

MIT 许可证

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