sabiql 3.0.1

Fast, safe-by-design, Vim-first DB TUI with ER diagrams
[workspace]
members = [
    "src/app",
    "src/domain",
    "src/infra",
    "src/ui",
]
resolver = "3"

[workspace.package]
version = "3.0.1"
edition = "2024"
rust-version = "1.98"
license = "MIT"
repository = "https://github.com/riii111/sabiql"

[workspace.dependencies]
# When adding third-party dependencies, update `absolute-paths-allowed-crates` in clippy.toml.
sabiql-domain = { path = "src/domain", version = "3.0.1" }
sabiql-app = { path = "src/app", version = "3.0.1" }
sabiql-infra = { path = "src/infra", version = "3.0.1" }
sabiql-ui = { path = "src/ui", version = "3.0.1" }
arboard = "3"
async-trait = "0.1"
clap = { version = "4", features = ["derive"] }
color-eyre = "0.6"
crossterm = { version = "0.29", features = ["event-stream"] }
csv = "1"
dirs = "5"
dotenvy = "0.15"
futures = "0.3"
insta = "1"
lru = "0.18"
libc = "0.2"
mockall = "0.13"
nucleo-matcher = "0.3"
quick-xml = { version = "0.38", features = ["async-tokio"] }
ratatui = "0.30"
rstest = "0.19"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
self_update = { version = "0.44", default-features = false, features = ["archive-tar", "archive-zip", "compression-flate2", "ureq", "rustls"] }
tempfile = "3"
thiserror = "2"
tokio = { version = "1", features = ["sync", "time", "io-util", "process", "rt-multi-thread", "macros", "fs"] }
tokio-util = "0.7"
toml = "0.8"
unicode-casefold = "0.2"
unicode-segmentation = "1"
unicode-width = "0.2"
urlencoding = "2"
url = "2"
uuid = { version = "1", features = ["v4", "v5"] }
windows-sys = { version = "0.61", features = [
    "Win32_Foundation",
    "Win32_Security",
    "Win32_Security_Authorization",
    "Win32_Storage_FileSystem",
    "Win32_System_Threading",
] }

[package]
name = "sabiql"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
description = "Fast, safe-by-design, Vim-first DB TUI with ER diagrams"
license.workspace = true
repository.workspace = true
homepage = "https://github.com/riii111/sabiql"
readme = "README.md"
keywords = ["postgresql", "mysql", "sqlite", "tui", "database"]
categories = ["command-line-utilities", "database"]

[dependencies]
crossterm.workspace = true
tokio.workspace = true
color-eyre.workspace = true
clap.workspace = true
dotenvy.workspace = true
self_update = { workspace = true, optional = true }
sabiql-app.workspace = true
sabiql-domain.workspace = true
sabiql-infra.workspace = true
sabiql-ui.workspace = true

[features]
default = []
self-update = ["dep:self_update"]

[dev-dependencies]
sabiql-domain.workspace = true
sabiql-app = { workspace = true, features = ["test-support"] }
sabiql-infra = { workspace = true, features = ["test-support"] }
sabiql-ui = { workspace = true, features = ["test-support"] }
ratatui.workspace = true
insta.workspace = true
tempfile.workspace = true
tokio = { workspace = true, features = ["test-util"] }

[lints]
workspace = true

[profile.release]
lto = true
codegen-units = 1

[workspace.lints.rust]
redundant_imports = "deny"
unreachable_pub = "deny"

[workspace.lints.clippy]
# Groups
all = { level = "deny", priority = -1 }
pedantic = { level = "warn", priority = -1 }
nursery = { level = "warn", priority = -1 }

# Pedantic suppressions
must_use_candidate = "allow"
missing_errors_doc = "allow"
missing_panics_doc = "allow"
module_name_repetitions = "allow"
doc_markdown = "allow"
similar_names = "allow"
too_many_lines = "allow"
cast_possible_truncation = "allow"
cast_possible_wrap = "allow"
cast_sign_loss = "allow"
cast_precision_loss = "allow"
cast_lossless = "allow"
items_after_statements = "allow"
needless_pass_by_value = "allow"  # Action/Command/PathBuf by-value in core APIs; refactor is out of scope
unused_self = "allow"
implicit_hasher = "allow"
match_wildcard_for_single_variants = "allow"
struct_field_names = "allow"

# Nursery suppressions
missing_const_for_fn = "allow"
significant_drop_tightening = "allow"
option_if_let_else = "allow"
future_not_send = "allow"
branches_sharing_code = "allow"
iter_with_drain = "allow"  # drain(..) inside loops where Vec is reused between iterations
collection_is_never_read = "allow"  # false positive: Vec used for sorting + hashing, not element-wise reads
used_underscore_binding = "allow"  # rstest #[case] doc params use _prefix convention; macro uses bindings internally

# Pedantic suppressions (continued)
naive_bytecount = "allow"  # bytecount crate would be an unnecessary dependency

# Restriction lints (opt-in)
absolute_paths = "warn"
dbg_macro = "deny"
exit = "deny"
get_unwrap = "deny"
mem_forget = "deny"
todo = "deny"
print_stdout = "deny"
print_stderr = "deny"
allow_attributes_without_reason = "deny"