# scuffle-bootstrap
> [!WARNING]
> This crate is under active development and may not be stable.

[](https://docs.rs/scuffle-bootstrap)
[](https://crates.io/crates/scuffle-bootstrap)
[](https://github.com/scufflecloud/scuffle/actions/workflows/ci.yaml)
[](https://codecov.io/gh/scufflecloud/scuffle)
---
A utility crate for creating binaries.
Refer to [`Global`](https://docs.rs/scuffle-bootstrap/0.1.3/scuffle_bootstrap/global/trait.Global.html), [`Service`](https://docs.rs/scuffle-bootstrap/0.1.3/scuffle_bootstrap/service/trait.Service.html), and [`main`](https://docs.rs/scuffle-bootstrap/0.1.3/scuffle_bootstrap/macro.main.html) for more information.
See the [changelog](./CHANGELOG.md) for a full release history.
### Feature flags
* **`docs`** — Enables changelog and documentation of feature flags
### Usage
````rust,no_run
use std::sync::Arc;
/// Our global state
struct Global;
// Required by the signal service
impl scuffle_signal::SignalConfig for Global {}
impl scuffle_bootstrap::global::GlobalWithoutConfig for Global {
async fn init() -> anyhow::Result<Arc<Self>> {
Ok(Arc::new(Self))
}
}
/// Our own custom service
struct MySvc;
impl scuffle_bootstrap::service::Service<Global> for MySvc {
async fn run(self, global: Arc<Global>, ctx: scuffle_context::Context) -> anyhow::Result<()> {
println!("running");
// Do some work here
// Wait for the context to be cacelled by the signal service
ctx.done().await;
Ok(())
}
}
// This generates the main function which runs all the services
scuffle_bootstrap::main! {
Global {
scuffle_signal::SignalSvc,
MySvc,
}
}
````
### License
This project is licensed under the MIT or Apache-2.0 license.
You can choose between one of them if you use this work.
`SPDX-License-Identifier: MIT OR Apache-2.0`