[workspace]
resolver = "3"
members = ["crates/twice-core", "crates/twice-server", "crates/twice-ui"]
[workspace.package]
version = "0.1.0"
edition = "2024"
rust-version = "1.85"
license = "MIT"
repository = "https://github.com/silen/twice"
[workspace.dependencies]
twice-core = { path = "crates/twice-core" }
anyhow = "1"
axum = { version = "0.8", features = ["macros"] }
bollard = "0.21"
eframe = { version = "0.36", default-features = false, features = [
"default_fonts",
"glow",
"wayland",
"x11",
] }
egui = "0.36"
futures-util = "0.3"
jiff = { version = "0.2", features = ["serde"] }
rand = "0.9"
reqwest = { version = "0.13", default-features = false, features = [
"charset",
"http2",
"json",
"rustls",
"stream",
"webpki-roots",
] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
subtle = "2"
thiserror = "2"
tokio = { version = "1", features = ["full"] }
tokio-stream = { version = "0.1", features = ["sync"] }
toml = "0.9"
tower-http = { version = "0.7", features = ["trace"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
uuid = { version = "1", features = ["serde", "v4"] }
[workspace.lints.rust]
unsafe_op_in_unsafe_fn = "deny"
missing_docs = "warn"
missing_debug_implementations = "warn"
unreachable_pub = "warn"
unused_must_use = "deny"
elided_lifetimes_in_paths = "warn"
non_ascii_idents = "deny"
trivial_numeric_casts = "warn"
unused_lifetimes = "warn"
single_use_lifetimes = "warn"
[workspace.lints.clippy]
all = { level = "deny", priority = -1 }
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }
cargo = { level = "warn", priority = -1 }
undocumented_unsafe_blocks = "deny"
multiple_unsafe_ops_per_block = "deny"
unwrap_used = "deny"
expect_used = "deny"
panic = "deny"
todo = "deny"
unimplemented = "deny"
unreachable = "deny"
indexing_slicing = "deny"
mem_forget = "deny"
arithmetic_side_effects = "warn"
cast_possible_truncation = "warn"
cast_possible_wrap = "warn"
cast_precision_loss = "warn"
cast_sign_loss = "warn"
as_underscore = "deny"
as_ptr_cast_mut = "deny"
fn_to_numeric_cast_any = "deny"
clone_on_ref_ptr = "warn"
mutex_atomic = "warn"
rc_buffer = "warn"
rc_mutex = "warn"
exit = "warn"
allow_attributes_without_reason = "warn"
dbg_macro = "warn"
use_debug = "warn"
mod_module_files = "warn"
empty_drop = "warn"
empty_structs_with_brackets = "warn"
empty_enums = "warn"
module_name_repetitions = "allow"
must_use_candidate = "allow"
missing_errors_doc = "allow"
# Workspace-internal crates: `#[non_exhaustive]` would only block our own
# members from constructing these types. Publishing is not a goal.
exhaustive_enums = "allow"
exhaustive_structs = "allow"
multiple_crate_versions = "allow"
# These crates are not published, so the registry metadata lints are noise.
cargo_common_metadata = "allow"
# Binary crates use `pub(crate)` to satisfy `unreachable_pub`; the nursery lint
# that wants plain `pub` there directly contradicts it.
redundant_pub_crate = "allow"
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
strip = "symbols"
debug = "line-tables-only"
[profile.dev]
opt-level = 0
debug = true
incremental = true