genesys 0.1.2

Component format & build code generation, no more repetitions!
Documentation

Genesys

Just a simple text format for declaring basic components and convert them to rust data types under build-time.

No more repetitive macro calls or extensive declarations for simple structures, just a blissfull list of components with simple control of use of crate/module/function and derive for all, modules or specific structs.

Empowered by pest

Todo

  • Use crates/mods in modules
  • Custom derive for modules
  • Impl Default for tuple structs
  • Generate enums
  • Identify single tuple structs primitive type to generate relevant ops code

Usage

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

Add this to the beginning of your file

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

Cheat sheet, genesys format

# 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
    }
}

Binary

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