
EFx
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 ({...}).
Install & import
Requires egui (the project currently uses egui 0.32). Add to Cargo.toml:
[]
= "0.6"
= "0.32" # or egui-based framework
Inside this repo just import the macro:
use efx; // the macro
Documentation
You can see on web page https://docs.rs/efx/latest/efx/ or in files:
Expression interpolation {...}
Inside tag content you can insert any Rust expression that implements Display:
let a = 2;
let b = 3;
efx!;
Escaping braces
To print { or }, use double braces (same as format!):
efx!;
Errors & diagnostics
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.
Current limitations
- Case-sensitive tag names.
- Interpolated expressions must implement
Display.
Roadmap & RFCs
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:
- 0.7 β Themes & layouts: lightweight style sheets, extended containers (
Tabs/Tablebehindextras), 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
Supported egui runtimes
EFx 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)- raw
winit+wgpu(viaegui-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(formacroquad/miniquadoverlays) - 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)
Quickstart (pick one)
A) eframe
# Cargo.toml
[]
= "0.6"
= "0.32"
use egui;
use efx;
default.show;
B) Bevy + bevy_egui
# Cargo.toml
[]
= "0.6"
= "0.16"
= "0.36" # re-exports `egui`
use ;
use efx;
new.show;
Tip: import
eguiviause bevy_egui::egui as egui;to avoid version mismatches.
C) Raw winit + wgpu
# Cargo.toml
[]
= "0.6"
= "0.32"
= "0.32"
= "0.32"
= "0.30"
= "26.0"
Use the example in examples/winit_wgpu_min.rs as a starting point.
Contributing
Thanks for considering a contribution! Please follow this lightweight workflow:
1) Pick or propose an issue
- Claim an issue: comment βIβd like to take thisβ (optionally add a brief plan/ETA). The maintainer will assign it to you.
- Propose a new issue: open a ticket with a minimal reproducible example (for bugs) or a short rationale (for features). Start with the roadmap RFC: EFX-0001.
Tip: issues labeled
good first issueare designed for first-time contributors.
2) Fork & branch
-
Fork the repository and create a feature branch from
main: -
Keep your branch focused on one issue.
3) Implement with tests & docs
-
Make the change and add tests/docs where it makes sense.
-
Local checks (examples build-only; no GUI run is required):
4) Open a Pull Request
- Target the next release branch (e.g.,
v0.6,v0.7). If the issue has a milestone, use the branch named after that milestone. - Link the issue (e.g., βCloses #123β) and fill the checklist below.
PR checklist
- References the related issue / RFC section when behavior changes.
- CI is green (workspace build, examples, wasm32 build-only).
- Tests/docs updated where applicable.
- No unrelated changes.
5) Reviews & merge
- Address review comments; small, focused PRs get merged faster.
- If you go silent for 7 days, the issue may be unassigned to keep momentum (you can re-claim it anytime).
Questions? Reach out at mail@zhukmax.com.
Changelog
See in file Changelog.md
Licence
The MIT License. Please see License File for more information.