sitrep 0.3.0

Frontend-agnostic progress reporting
Documentation
# `sitrep`

[![Crates.io](https://img.shields.io/crates/v/sitrep)](https://crates.io/crates/sitrep)
[![Crates.io](https://img.shields.io/crates/d/sitrep)](https://crates.io/crates/sitrep)
[![Crates.io](https://img.shields.io/crates/l/sitrep)](https://crates.io/crates/sitrep)
[![docs.rs](https://docs.rs/sitrep/badge.svg)](https://docs.rs/sitrep/)

Frontend-agnostic progress reporting.

----

## Usage

```rust
use std::{sync::{mpsc, Arc}, thread, time::Duration};

use sitrep::{
    Event, MessageEvent, Progress, DetachmentEvent, Reporter, StdMpscObserver, Task, UpdateEvent,
};

fn main() {
    let (sender, receiver) = mpsc::channel();
    let observer = Arc::new(StdMpscObserver::from(sender));

    let (progress, reporter) = Progress::new(Task::default(), observer);

    // The sending end of the progress report:
    let worker_handle = thread::spawn(move || {
        progress.set_label("Crunching numbers ...".to_owned());

        let total = 100;
        progress.set_total(total);

        for completed in 1..=total {
            thread::sleep(Duration::from_millis(100));

            progress.set_completed(completed);
        }
    });

    // The receiving end of the progress report:
    let reporter_handle = thread::spawn(move || {
        while let Ok(event) = receiver.recv() {
            let Event::Update(UpdateEvent { id }) = event else {
                continue;
            };

            // The reporter is only available as long as
            // the corresponding progress is alive, too:
            let Some(reporter) = reporter.upgrade() else {
                break;
            };

            println!("{:#?}", reporter.report());
        }
    });

    worker_handle.join().unwrap();
    reporter_handle.join().unwrap();
}
```

See the [examples](examples/) directory for more examples.

## Documentation

Please refer to the documentation on [docs.rs](https://docs.rs/sitrep).

## Contributing

Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our [code of conduct](https://www.rust-lang.org/conduct.html),  
and the process for submitting pull requests to us.

## Versioning

We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/regexident/sitrep/tags).

## License

This project is licensed under the [**MPL-2.0**](https://www.tldrlegal.com/l/mpl-2.0) – see the [LICENSE.md](LICENSE.md) file for details.