#component #format #generation #build #generate #tuple #repetition

bin+lib genesys

组件格式 & 构建代码生成,不再重复!

3 个版本

0.1.2 2021年4月23日
0.1.1 2021年4月23日
0.1.0 2021年4月23日

#10 in #repetition

自定义许可协议

18KB
382

Genesys

一个简单的文本格式,用于声明基本组件,并在构建时将它们转换为 Rust 数据类型。

不再需要重复宏调用或大量声明简单的结构,只需一个美好的组件列表,以及简单控制 crate/module/函数的使用和为所有模块或特定结构体的 derive。

由 pest 支持

待办事项

  • 在模块中使用 crates/mods
  • 为模块自定义 derive
  • 为元组结构体实现 Default
  • 生成枚举
  • 识别单个元组结构体的原始类型以生成相关的 ops 代码

用法

build.rs

use std::env;
use std::path::PathBuf;

fn main() {
    println!("cargo:rerun-if-changed=src/components");
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    genesys::generate("src/components", out_path.join("components.rs")).unwrap();
}

main.rs/lib.rs

将此添加到文件的开头

include!(concat!(env!("OUT_DIR"), "/components.rs"));

速查表,genesys 格式

# Default use, applied to all modules
global_use {
    # Comma-separated modules/functions
    bevy::prelude::Entity,
    bevy::prelude::*
}

# Default derive, applied to all components
global_derive (Debug, Entity)

# Components are either empty structs, tuple structs or named structs (enum comming soon)
# One component declaration per line

MyComponent
MyTupleComponent str # str gets translated to String
MyNamedComponent name: String, weight: f32

# Modules are declared with the modulus symbol "%"
%object {
    # Local use(overrides global use)
    use {
        entities::MySpecialEntity
    }

    # Local derive(overrides global)
    derive (MySpecialEntity)

    Name str
    Weight f32

    %item {
        Item
        Food
        TradeGood
        Weapon
        Armor
    }
}

二进制文件

cargo run -- example/components # Prints components as rust
cargo run -- example/components components.rs # Writes output to components.rs

依赖项

~2.2–3MB
~59K SLoC