# rtb-app
> Part of the [phpboyscout Rust toolkit](https://rust.phpboyscout.uk) —
> small, framework-free crates extracted from
> [rust-tool-base](https://gitlab.com/phpboyscout/rust-tool-base).
A two-crate family workspace sharing one version line:
- **`rtb-app`** — the application context (`App`), tool metadata,
runtime features, and the `Command` plugin trait with its
`BUILTIN_COMMANDS` link-time registry. The structural heart of the
framework: typed `Arc`-wrapped fields, no DI container, no
`Box<dyn Any>` bag.
- **`rtb-test-support`** — the promoted test-side `App` constructor
(`TestAppBuilder` behind a sealed `TestWitness`), consumed from
`[dev-dependencies]` by downstream crates.
```rust
use rtb_app::features::{Feature, Features};
let features = Features::builder().disable(Feature::Init).build();
assert!(!features.is_enabled(Feature::Init));
assert!(features.is_enabled(Feature::Version));
```
`Feature` and `Features` live in `rtb_app::features`, not at the crate
root — `use rtb_app::prelude::*;` brings both in alongside the rest of
the usual wiring types.
## Documentation
<https://app.rust.phpboyscout.uk>
- **[Tutorial](https://app.rust.phpboyscout.uk/tutorials/01-your-first-command/)**
— from an empty crate to a registered command with passing tests.
- **[How-to guides](https://app.rust.phpboyscout.uk/how-to/)** —
registering commands, reporting your own version, reading typed
config, wiring self-update, building an `App` in tests.
- **[Reference](https://app.rust.phpboyscout.uk/reference/)** — every
public type, field and default, and what happens when one is wrong.
- **[Explanation](https://app.rust.phpboyscout.uk/explanation/)** — why
`App` is not a container, why registration is link-time, why the
config is type-erased, and
[what this crate does not do](https://app.rust.phpboyscout.uk/explanation/05-limitations/).
Other links:
- **API reference:** <https://docs.rs/rtb-app> ·
<https://docs.rs/rtb-test-support>
- **Crates:** <https://crates.io/crates/rtb-app> ·
<https://crates.io/crates/rtb-test-support>
## Development
`just ci` runs the full local gate (fmt, clippy, nextest, doc, deny).
Tests include a cucumber BDD suite (`crates/rtb-app/tests/bdd.rs`) and
trybuild compile-fail fixtures (run isolated — see
`.config/nextest.toml`; nextest is required). Releases are cut by
release-plz from Conventional Commits — do not tag manually.
## License
MIT