watchexec/lib/README.md

116 lines
4.3 KiB
Markdown
Raw Normal View History

2021-05-08 17:39:13 +02:00
[![Crates.io page](https://badgen.net/crates/v/watchexec)](https://crates.io/crates/watchexec)
[![API Docs](https://docs.rs/watchexec/badge.svg)][docs]
[![Crate license: Apache 2.0](https://badgen.net/badge/license/Apache%202.0)][license]
2022-01-18 10:38:15 +01:00
![MSRV: 1.58.0 (minor)](https://badgen.net/badge/MSRV/1.58.0%20%28minor%29/0b7261)
2021-05-08 17:39:13 +02:00
[![CI status](https://github.com/watchexec/watchexec/actions/workflows/check.yml/badge.svg)](https://github.com/watchexec/watchexec/actions/workflows/check.yml)
# Watchexec library
2021-06-28 15:15:00 +02:00
_The library which powers [Watchexec CLI](https://watchexec.github.io) and other tools._
2021-05-08 17:39:13 +02:00
- **[API documentation][docs]**.
- Licensed under [Apache 2.0][license].
2022-01-18 10:14:34 +01:00
- Minimum Supported Rust Version: 1.58.0 (incurs a minor semver bump).
2021-10-16 16:37:12 +02:00
- Status: in preview (`2.0.0-pre.N` series).
2021-05-08 17:39:13 +02:00
2022-01-18 10:38:15 +01:00
[docs]: https://docs.rs/watchexec/2.0.0-pre.5
2021-05-08 17:39:13 +02:00
[license]: ../LICENSE
## Quick start
```rust
2021-10-16 16:37:12 +02:00
use miette::{IntoDiagnostic, Result};
2021-05-08 17:39:13 +02:00
use watchexec::{
2021-10-16 16:37:12 +02:00
Watchexec,
action::{Action, Outcome},
config::{InitConfig, RuntimeConfig},
2022-01-18 10:38:15 +01:00
handler::PrintDebug,
2021-05-08 17:39:13 +02:00
};
2021-10-16 16:37:12 +02:00
#[tokio::main]
async fn main() -> Result<()> {
let mut init = InitConfig::default();
init.on_error(PrintDebug(std::io::stderr()));
2021-05-08 17:39:13 +02:00
2021-10-16 16:37:12 +02:00
let mut runtime = RuntimeConfig::default();
runtime.pathset(["watchexec.conf"]);
2022-01-18 10:38:15 +01:00
let conf = YourConfigFormat::load_from_file("watchexec.conf").await.into_diagnostic()?;
2021-10-16 16:37:12 +02:00
conf.apply(&mut runtime);
let we = Watchexec::new(init, runtime.clone())?;
let w = we.clone();
let c = runtime.clone();
runtime.on_action(move |action: Action| {
let mut c = c.clone();
let w = w.clone();
async move {
2022-01-18 10:38:15 +01:00
for event in action.events.iter() {
2021-10-16 16:37:12 +02:00
if event.paths().any(|(p, _)| p.ends_with("/watchexec.conf")) {
let conf = YourConfigFormat::load_from_file("watchexec.conf").await?;
conf.apply(&mut c);
2022-01-18 10:38:15 +01:00
let _ = w.reconfigure(c.clone());
2021-10-16 16:37:12 +02:00
// tada! self-reconfiguring watchexec on config file change!
2021-05-08 17:39:13 +02:00
2021-10-16 16:37:12 +02:00
break;
}
}
2021-05-08 17:39:13 +02:00
2021-10-16 16:37:12 +02:00
action.outcome(Outcome::if_running(
Outcome::DoNothing,
Outcome::both(Outcome::Clear, Outcome::Start),
));
2021-05-08 17:39:13 +02:00
2022-01-18 10:38:15 +01:00
Ok::<(), std::io::Error>(())
2021-10-16 16:37:12 +02:00
}
});
2021-05-08 17:39:13 +02:00
2022-01-18 10:38:15 +01:00
let _ = we.main().await.into_diagnostic()?;
2021-10-16 16:37:12 +02:00
Ok(())
2021-05-08 17:39:13 +02:00
}
```
2021-10-16 16:37:12 +02:00
## Kitchen sink
The library also exposes a large amount of components which are available to make your own tool, or
to make anything else you may want:
2022-01-18 10:38:15 +01:00
- **[Command handling](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/command/index.html)**, to
2021-10-16 16:37:12 +02:00
build a command with an arbitrary shell, deal with grouped and ungrouped processes the same way,
and supervise a process while also listening for & acting on interventions such as sending signals.
2022-01-18 10:38:15 +01:00
- **Event sources**: [Filesystem](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/fs/index.html),
[Signals](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/signal/source/index.html), (more to come).
2021-10-16 16:37:12 +02:00
2022-01-18 10:38:15 +01:00
- Finding **[a common prefix](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/paths/fn.common_prefix.html)**
2021-10-16 16:37:12 +02:00
of a set of paths.
2022-01-18 10:38:15 +01:00
- Detecting the **[origin(s)](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/project/fn.origins.html)**
and **[types](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/project/fn.types.html)** of projects.
2021-10-16 16:37:12 +02:00
- Discovering project-local and global
2022-01-18 10:38:15 +01:00
**[ignore files](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/ignore/index.html)**.
- And [more][docs]!
2021-10-16 16:37:12 +02:00
There are also separate, standalone crates used to build Watchexec which you can tap into:
- **[ClearScreen](https://docs.rs/clearscreen)** makes clearing the terminal screen in a
cross-platform way easy by default, and provides advanced options to fit your usecase.
- **[Command Group](https://docs.rs/command-group)** augments the std and tokio `Command` with
support for process groups, portable between Unix and Windows.
## Tagged filters (alpha)
This library is also the home of Watchexec's current _two_ filtering implementations: the v1
behaviour which has proven confusing and inconsistent over the years, and an upcoming complete
2022-01-18 10:14:34 +01:00
overhaul called "tagged filtering" which will potentially replace the legacy one.
2021-10-16 16:37:12 +02:00
2022-01-18 10:14:34 +01:00
Have a look at the [docs](https://docs.rs/watchexec/2.0.0-pre.5/watchexec/filter/tagged/struct.TaggedFilterer.html)!