2021-08-16 11:49:12 +02:00
|
|
|
//! Watchexec: a library for utilities and programs which respond to events;
|
|
|
|
//! file changes, human interaction, and more.
|
2019-10-27 10:54:44 +01:00
|
|
|
//!
|
2021-08-19 10:31:29 +02:00
|
|
|
//! Also see the CLI tool: <https://watchexec.github.io/>
|
2019-10-27 11:29:58 +01:00
|
|
|
//!
|
2021-08-19 10:31:29 +02:00
|
|
|
//! This library is powered by [Tokio](https://tokio.rs), minimum version 1.10. This requirement may
|
|
|
|
//! change (upwards) in the future without breaking change.
|
2021-08-16 11:49:12 +02:00
|
|
|
//!
|
2021-08-21 10:46:44 +02:00
|
|
|
//! The main way to use this crate involves constructing a [`Watchexec`] around an
|
|
|
|
//! [`InitConfig`][config::InitConfig] and a [`RuntimeConfig`][config::RuntimeConfig], then running
|
|
|
|
//! it. [`Handler`][handler::Handler]s are used to hook into watchexec at various points. The
|
2021-08-22 14:31:39 +02:00
|
|
|
//! runtime config can be changed at any time with the [`Watchexec::reconfigure()`] method.
|
2021-08-19 10:31:29 +02:00
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! ```no_run
|
|
|
|
//! # use color_eyre::eyre::Report;
|
|
|
|
//! # use std::convert::Infallible;
|
|
|
|
//! use watchexec::{
|
|
|
|
//! Watchexec,
|
|
|
|
//! action::{Action, Outcome},
|
|
|
|
//! config::{InitConfigBuilder, RuntimeConfig},
|
|
|
|
//! handler::{Handler as _, PrintDebug},
|
|
|
|
//! };
|
2021-08-19 16:56:13 +02:00
|
|
|
//!
|
|
|
|
//! #[tokio::main]
|
2021-08-22 12:06:50 +02:00
|
|
|
//! async fn main() -> Result<(), Report> {
|
|
|
|
//! let mut init = InitConfigBuilder::default();
|
|
|
|
//! init.on_error(PrintDebug(std::io::stderr()));
|
2021-08-21 10:46:44 +02:00
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! let mut runtime = RuntimeConfig::default();
|
2021-08-22 10:49:24 +02:00
|
|
|
//! runtime.pathset(["watchexec.conf"]);
|
2021-08-19 16:56:13 +02:00
|
|
|
//!
|
|
|
|
//! let conf = YourConfigFormat::load_from_file("watchexec.conf").await?;
|
2021-08-21 10:46:44 +02:00
|
|
|
//! conf.apply(&mut runtime);
|
2021-08-19 16:56:13 +02:00
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! let we = Watchexec::new(init.build().unwrap(), runtime.clone())?;
|
2021-08-19 16:56:13 +02:00
|
|
|
//! let w = we.clone();
|
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! let c = runtime.clone();
|
|
|
|
//! runtime.on_action(move |action: Action| {
|
|
|
|
//! let mut c = c.clone();
|
|
|
|
//! let w = w.clone();
|
|
|
|
//! async move {
|
|
|
|
//! for event in &action.events {
|
|
|
|
//! if event.paths().any(|p| p.ends_with("/watchexec.conf")) {
|
|
|
|
//! let conf = YourConfigFormat::load_from_file("watchexec.conf").await?;
|
2021-08-19 16:56:13 +02:00
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! conf.apply(&mut c);
|
2021-08-22 14:31:39 +02:00
|
|
|
//! w.reconfigure(c.clone());
|
2021-08-22 12:06:50 +02:00
|
|
|
//! // tada! self-reconfiguring watchexec on config file change!
|
|
|
|
//!
|
|
|
|
//! break;
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! action.outcome(Outcome::if_running(
|
|
|
|
//! Outcome::DoNothing,
|
2021-08-22 13:22:27 +02:00
|
|
|
//! Outcome::both(Outcome::Clear, Outcome::Start),
|
2021-08-22 12:06:50 +02:00
|
|
|
//! ));
|
|
|
|
//!
|
|
|
|
//! Ok(())
|
|
|
|
//! # as Result<_, Infallible>
|
2021-08-19 16:56:13 +02:00
|
|
|
//! }
|
|
|
|
//! });
|
|
|
|
//!
|
2021-08-22 12:06:50 +02:00
|
|
|
//! we.main().await?;
|
|
|
|
//! Ok(())
|
2021-08-19 16:56:13 +02:00
|
|
|
//! }
|
2021-08-22 12:06:50 +02:00
|
|
|
//! # struct YourConfigFormat;
|
|
|
|
//! # impl YourConfigFormat {
|
|
|
|
//! # async fn load_from_file(_: &str) -> Result<Self, Infallible> { Ok::<_, Infallible>(Self) }
|
|
|
|
//! # fn apply(&self, _: &mut RuntimeConfig) { }
|
|
|
|
//! # }
|
2021-08-19 16:56:13 +02:00
|
|
|
//! ```
|
|
|
|
//!
|
2021-08-19 10:31:29 +02:00
|
|
|
//! Alternatively, one can use the modules exposed by the crate and the external crates such as
|
|
|
|
//! [ClearScreen][clearscreen] and [Command Group][command_group] to build something more advanced,
|
|
|
|
//! at the cost of reimplementing the glue code. See the examples folder for some basic/demo tools
|
|
|
|
//! written with the individual modules.
|
2021-08-16 11:49:12 +02:00
|
|
|
//!
|
|
|
|
//! This crate does not itself use `unsafe`. However, it depends on a number of libraries which do,
|
|
|
|
//! most because they interact with the operating system.
|
2019-10-27 10:54:44 +01:00
|
|
|
|
2021-07-20 10:32:38 +02:00
|
|
|
#![doc(html_favicon_url = "https://watchexec.github.io/logo:watchexec.svg")]
|
|
|
|
#![doc(html_logo_url = "https://watchexec.github.io/logo:watchexec.svg")]
|
2021-04-10 19:44:24 +02:00
|
|
|
#![warn(clippy::unwrap_used)]
|
2021-08-16 11:49:12 +02:00
|
|
|
#![forbid(unsafe_code)]
|
2019-10-27 12:06:09 +01:00
|
|
|
|
2021-08-18 15:12:50 +02:00
|
|
|
// the toolkit to make your own
|
2021-08-20 18:43:55 +02:00
|
|
|
pub mod action;
|
2021-08-19 11:28:56 +02:00
|
|
|
pub mod command;
|
2018-09-08 13:51:44 +02:00
|
|
|
pub mod error;
|
2021-08-16 11:49:12 +02:00
|
|
|
pub mod event;
|
2021-08-16 15:15:17 +02:00
|
|
|
pub mod fs;
|
2021-08-17 11:41:13 +02:00
|
|
|
pub mod signal;
|
2021-08-16 17:09:22 +02:00
|
|
|
|
2021-08-18 15:12:50 +02:00
|
|
|
// the core experience
|
2021-08-21 10:46:44 +02:00
|
|
|
pub mod config;
|
2021-08-21 11:12:40 +02:00
|
|
|
pub mod handler;
|
2021-08-18 15:12:50 +02:00
|
|
|
mod watchexec;
|
|
|
|
|
|
|
|
#[doc(inline)]
|
2021-08-20 18:43:15 +02:00
|
|
|
pub use crate::watchexec::Watchexec;
|
2021-08-18 15:12:50 +02:00
|
|
|
|
2021-08-16 17:09:22 +02:00
|
|
|
// the *action* is debounced, not the events
|