| Crates.io | efx |
| lib.rs | efx |
| version | 0.6.1 |
| created_at | 2025-08-17 06:59:04.132099+00 |
| updated_at | 2025-10-08 17:33:47.429172+00 |
| description | Rust XML templating engine for building egui UIs with procedural macros |
| homepage | |
| repository | https://github.com/ZhukMax/efx |
| max_upload_size | |
| id | 1799178 |
| size | 445,935 |

EFx β Rust π¦ XML Template Engine for egui-based frameworks: eframe, bevy_egui, egui-winit, egui-miniquad.
efx! is a proc-macro for writing tiny XML-like UI snippets in eframe/egui. It converts short tags into egui calls.
Simplicity and Convenience β XML, π Speed and π Security β Rust
Easy as HTML, Fast as C
You can embed arbitrary Rust expressions inside braces ({...}).
Requires egui (the project currently uses egui 0.32). Add to Cargo.toml:
[dependencies]
efx = "0.6"
egui = "0.32" # or egui-based framework
Inside this repo just import the macro:
use efx::efx; // the macro
You can see on web page https://docs.rs/efx/latest/efx/ or in files:
{...}Inside tag content you can insert any Rust expression that implements Display:
let a = 2;
let b = 3;
efx!(ui, r#"<Label>Sum: {a + b}</Label>"#);
To print { or }, use double braces (same as format!):
efx!(ui, r#"<Label>Literals: {{ and }}</Label>"#);
At compile time the macro parses your snippet; at runtime it shows readable diagnostics via ui.Label(...) when input is invalid:
Unknown tag
Output: Unknown tag: <TagName>
Mismatched open/close tags
Output: Mismatched tags: <open> and </close>
Interpolation count mismatch
Happens if the parser found e.g. two {expr} parts but after processing the text thereβs a different number of {} placeholders. Make the counts match.
Display.TL;DR. EFx is a minimalist XML DSL on top of egui that compiles to plain ui.* calls.
The next three releases focus on expressiveness and first-class examples across popular egui runtimes:
Tabs/Table behind extras), perf & polish.This plan is incremental and non-breaking; new features are opt-in. Priorities may change based on community feedback.
π Full RFC: EFX-0001 β Roadmap 0.5β0.7
π RFC index: RFC/README.md
egui runtimesEFx renders into any runtime that provides &mut egui::Ui. We officially build examples for the following targets:
Tier-1
eframe (native + wasm)bevy_egui (native)winit+wgpu (via egui-winit + egui-wgpu). Wgpu - a cross-platform, safe, pure-rust graphics API. It runs natively on Vulkan, Metal, D3D12, and OpenGL; and on top of WebGL2 and WebGPU on wasm. Follows WebGPU specification. With async/await API.Tier-2 (compatible today; examples later / community support)
egui-miniquad (for macroquad/miniquad overlays) - Relatively minimalistic API well suited for small to medium graphics projects. Supports multiple backends, including browser target.egui_sdl2_* backendsegui_glow / tao (lower-level backends)A) eframe
# Cargo.toml
[dependencies]
efx = "0.6"
eframe = "0.32"
use eframe::egui;
use efx::efx;
egui::CentralPanel::default().show(ctx, |ui| {
efx!(ui, r#"<Column><Label>Hello, EFx</Label><Separator/></Column>"#);
});
B) Bevy + bevy_egui
# Cargo.toml
[dependencies]
efx = "0.6"
bevy = "0.16"
bevy_egui = "0.36" # re-exports `egui`
use bevy_egui::{EguiPlugin, EguiContexts};
use efx::efx;
bevy_egui::egui::Window::new("EFx").show(egui_ctx.ctx_mut(), |ui| {
efx!(ui, r#"<Row><Label>It works</Label></Row>"#);
});
Tip: import
eguiviause bevy_egui::egui as egui;to avoid version mismatches.
C) Raw winit + wgpu
# Cargo.toml
[dependencies]
efx = "0.6"
egui = "0.32"
egui-winit = "0.32"
egui-wgpu = "0.32"
winit = "0.30"
wgpu = "26.0"
Use the example in examples/winit_wgpu_min.rs as a starting point.
Thanks for considering a contribution! Please follow this lightweight workflow:
Tip: issues labeled
good first issueare designed for first-time contributors.
Fork the repository and create a feature branch from main:
git checkout main
git pull
git checkout -b feat/short-topic
Keep your branch focused on one issue.
Make the change and add tests/docs where it makes sense.
Local checks (examples build-only; no GUI run is required):
cargo fmt --all
cargo clippy --all-targets -- -D warnings
cargo build --workspace --locked
cargo build -p efx --example eframe_demo --locked
rustup target add wasm32-unknown-unknown
cargo build -p efx --example eframe_demo --target wasm32-unknown-unknown --locked
v0.6, v0.7).
If the issue has a milestone, use the branch named after that milestone.PR checklist
Questions? Reach out at mail@zhukmax.com.
See in file Changelog.md
The MIT License. Please see License File for more information.