execra 1.1.0

Typed job runtime for Rust apps that wrap external CLI tools: events, interpreters, cancellation, Tauri integration, and optional persistence.
Documentation
[package]
name = "execra"
description = "Typed job runtime for Rust apps that wrap external CLI tools: events, interpreters, cancellation, Tauri integration, and optional persistence."
authors = ["AmarBego"]
version = "1.1.0"
edition = "2021"
license = "Apache-2.0"
repository = "https://github.com/AmarBego/Execra"
readme = "README.md"
keywords = ["process", "subprocess", "runtime", "job", "tokio"]
categories = ["asynchronous", "os"]

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]

[workspace]
members = [
    ".",
    "crates/execra-cli",
]
resolver = "2"

[features]
default = ["bundled-sqlite", "gzip"]

# Bundle SQLite with the `rusqlite` crate. Disable to link against the
# system-provided SQLite library (the host must then have `libsqlite3`
# available at build time).
bundled-sqlite = ["rusqlite/bundled"]

# Enable `RawOutputPolicy::PersistGzipOnFinalize`. Without this feature the
# variant is not compiled in and `flate2` is not pulled into the dependency
# tree; raw logs can still be persisted uncompressed.
gzip = ["dep:flate2"]

# Enable `execra::tauri`, a first-class plugin for Tauri apps. Pulls in
# `tauri` as a dependency. Off by default so non-Tauri consumers stay lean.
tauri = ["dep:tauri"]

# Enable `execra::interpret`, the table-driven interpreter toolkit
# (`rules!` macro, `RuleInterpreter`). Pulls in `regex`. Off by default so
# consumers that hand-write interpreters don't pay for it.
interpret = ["dep:regex"]

[dependencies]
uuid = { version = "1.23.1", features = ["v7", "serde"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1"
thiserror = "2.0.18"
flate2 = { version = "1", optional = true }
regex = { version = "1.12.3", optional = true }
rusqlite = { version = "0.39.0", default-features = false }
tokio = { version = "1", features = ["fs", "process", "rt", "rt-multi-thread", "io-util", "macros", "sync", "time"] }
tokio-stream = { version = "0.1", features = ["sync"] }
tokio-util = { version = "0.7", features = ["rt"] }
futures-core = "0.3"
tauri = { version = "2", optional = true, default-features = false }

[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.61.2", features = ["Win32_Foundation", "Win32_Security", "Win32_System_JobObjects", "Win32_System_Threading"] }

[target.'cfg(unix)'.dependencies]
libc = "0.2"

[dev-dependencies]
regex = "1.12.3"
once_cell = "1.21.4"

[[example]]
name = "scoop_install"
path = "examples/scoop_install.rs"
crate-type = ["lib"]

[[example]]
name = "scoop_doctor"
path = "examples/scoop_doctor.rs"
crate-type = ["lib"]

[[example]]
name = "move1_acceptance"
path = "examples/move1_acceptance.rs"