#cargo-features = ["profile-rustflags"]

[workspace]
resolver = "2"
members = ["src/*"]
default-members = ["src/*"]

[workspace.package]
authors = [
	"Timo Kösters <timo@koesters.xyz>",
	"June Clementine Strawberry <june@girlboss.ceo>",
	"Jason Volk <jason@zemos.net>",
	"Conduit Contributors",
	"Conduwuit Contributors",
	"Tuwunel Contributors",
]
categories = ["network-programming"]
description = "High Performance Matrix Homeserver in Rust!"
edition = "2024"
homepage = "https://tuwunel.chat"
keywords = [
	"chat",
	"matrix",
	"networking",
	"server",
	"uwu",
]
license = "Apache-2.0"
readme = "README.md"
repository = "https://github.com/matrix-construct/tuwunel"
rust-version = "1.89.0"
version = "1.4.6"

[workspace.metadata.crane]
name = "tuwunel"

#
# Dependencies
#

[workspace.dependencies.argon2]
version = "0.5"
default-features = false
features = [
	"alloc",
	"rand",
]

[workspace.dependencies.arrayvec]
version = "0.7"
features = ["serde"]

[workspace.dependencies.async-channel]
version = "2.3.1"

[workspace.dependencies.async-trait]
version = "0.1"

[workspace.dependencies.axum]
version = "0.8"
default-features = false
features = [
	"form",
	"http1",
	"http2",
	"json",
	"matched-path",
	"tokio",
	"tracing",
]

[workspace.dependencies.axum-client-ip]
version = "0.7"

[workspace.dependencies.axum-extra]
version = "0.10"
default-features = false
features = [
	"typed-header",
	"tracing",
]

[workspace.dependencies.axum-server]
version = "0.7"
default-features = false

[workspace.dependencies.axum-server-dual-protocol]
version = "0.7"
default-features = false

[workspace.dependencies.base64]
version = "0.22"
default-features = false

[workspace.dependencies.blurhash]
version = "0.2"
default-features = false
features = [
	"fast-linear-to-srgb",
	"image",
]

[workspace.dependencies.bytes]
version = "1.10"

[workspace.dependencies.bytesize]
version = "2.1"

[workspace.dependencies.cargo_toml]
version = "0.22"
default-features = false
features = ["features"]

[workspace.dependencies.checked_ops]
version = "0.1"

[workspace.dependencies.chrono]
version = "0.4"
features = ["alloc", "std"]
default-features = false

[workspace.dependencies.clap]
version = "4.5"
default-features = false
features = [
	"derive",
	"env",
	"error-context",
	"help",
	"std",
	"string",
	"usage",
]

# Disabled until Axum updated. Remember to remove cfgs for tuwunel_disable.
#[workspace.dependencies.console-subscriber]
#version = "0.4"

[workspace.dependencies.core_affinity]
version = "0.8.3"

[workspace.dependencies.const-str]
version = "0.7"

[workspace.dependencies.criterion]
version = "0.7"
default-features = false
features = [
	"cargo_bench_support",
	"async_futures",
	"async_tokio",
]

[workspace.dependencies.ctor]
version = "0.5"

[workspace.dependencies.cyborgtime]
version = "2.1"

[workspace.dependencies.either]
version = "1.15"
default-features = false
features = ["serde"]

[workspace.dependencies.figment]
version = "0.10"
default-features = false
features = ["env", "toml"]

[workspace.dependencies.futures]
version = "0.3"
default-features = false
features = ["std", "async-await"]

[workspace.dependencies.hickory-resolver]
version = "0.25"
default-features = false
features = [
	"serde",
	"system-config",
	"tokio",
]

[workspace.dependencies.hmac]
version = "0.12"
default-features = false

[workspace.dependencies.http]
version = "1.3"

[workspace.dependencies.http-body-util]
version = "0.1"

[workspace.dependencies.hyper]
version = "1.7"
default-features = false
features = [
	"server",
	"http1",
	"http2",
]

[workspace.dependencies.hyper-util]
version = "0.1.14"
default-features = false
features = [
	"server-auto",
	"server-graceful",
	"tokio",
]

[workspace.dependencies.image]
version = "0.25"
default-features = false
features = [
	"jpeg",
	"png",
	"gif",
	"webp",
]

[workspace.dependencies.insta]
version = "1.43"
features = [
	"json",
]

[workspace.dependencies.ipaddress]
version = "0.1"

[workspace.dependencies.itertools]
version = "0.14"

[workspace.dependencies.jsonwebtoken]
version = "9.3"
default-features = false
features = ["use_pem"]

[workspace.dependencies.ldap3]
git = "https://github.com/matrix-construct/ldap3"
rev = "7d423314b9dbc66347284e38fc2b78c3d8f3d494"
default-features = false
features = ["sync", "tls-rustls"]

[workspace.dependencies.libc]
version = "0.2"

[workspace.dependencies.libloading]
version = "0.8"

[workspace.dependencies.log]
version = "0.4"
default-features = false

[workspace.dependencies.loole]
version = "0.4"

[workspace.dependencies.lru-cache]
version = "0.1"

[workspace.dependencies.maplit]
version = "1.0"

[workspace.dependencies.minicbor]
version = "2.1"
features = ["std"]

[workspace.dependencies.minicbor-serde]
version = "0.6"
features = ["std"]

[workspace.dependencies.nix]
version = "0.30"
default-features = false
features = [
	"resource",
	"user",
]

[workspace.dependencies.num-traits]
version = "0.2"

[workspace.dependencies.opentelemetry]
version = "0.31"

# Disabled until they move to opentelemetry 0.30
#[workspace.dependencies.opentelemetry-jaeger]
#version = "0.22.0"
#features = ["rt-tokio"]

[workspace.dependencies.opentelemetry_sdk]
version = "0.31"
features = ["rt-tokio"]

[workspace.dependencies.proc-macro2]
version = "1.0"

[workspace.dependencies.quote]
version = "1.0"

[workspace.dependencies.rand]
version = "0.8"

[workspace.dependencies.regex]
version = "1.12"

[workspace.dependencies.reqwest]
version = "0.12"
default-features = false
features = [
	"rustls-tls-native-roots",
	"socks",
	"hickory-dns",
	"http2",
]

[workspace.dependencies.ring]
version = "0.17"
default-features = false

[workspace.dependencies.ruma]
git = "https://github.com/matrix-construct/ruma"
rev = "db4bf59eaa1757735f38489f8924348ae05a6a17"
features = [
    "__compat",
    "appservice-api-c",
    "client-api",
    "client-api-s",
    "compat-upload-signatures",
    "federation-api",
    "identifiers-validation",
    "markdown",
    "push-gateway-api-c",
    "rand",
    "ring-compat",
    "unstable-msc2448",
    "unstable-msc2666",
    "unstable-msc2867",
    "unstable-msc2870",
    "unstable-msc3026",
    "unstable-msc3061",
    "unstable-msc3814",
    "unstable-msc3245",
    "unstable-msc3381", # polls
    "unstable-msc3489", # beacon / live location
    "unstable-msc3930", # polls push rules
    "unstable-msc4075",
    "unstable-msc4095",
    "unstable-msc4121",
    "unstable-msc4125",
    "unstable-msc4133",
    "unstable-msc4143",
    "unstable-msc4186",
    "unstable-msc4203", # sending to-device events to appservices 
    "unstable-msc4310",
    "unstable-msc4311",
    "unstable-extensible-events",
]

[workspace.dependencies.rustls]
version = "0.23"
default-features = false
features = ["aws_lc_rs"]

[workspace.dependencies.rustyline-async]
version = "0.4.6"
default-features = false

[workspace.dependencies.rust-rocksdb]
git = "https://github.com/matrix-construct/rust-rocksdb"
rev = "225a42519276e502205bdc845cebdb22d70ee245"
default-features = false
features = [
	"bzip2",
	"lz4",
	"multi-threaded-cf",
	"mt_static",
	"zstd",
]

[workspace.dependencies.sanitize-filename]
version = "0.6"

[workspace.dependencies.sd-notify]
version = "0.4"
default-features = false

[workspace.dependencies.sentry]
version = "0.45"
default-features = false
features = [
    "backtrace",
    "contexts",
    "debug-images",
    "panic",
    "rustls",
    "tower",
    "tower-http",
    "tracing",
    "reqwest",
    "log",
]

[workspace.dependencies.sentry-tower]
version = "0.45"

[workspace.dependencies.sentry-tracing]
version = "0.45"

[workspace.dependencies.serde]
version = "1.0"
default-features = false
features = ["rc"]

[workspace.dependencies.serde_html_form]
version = "0.2"

[workspace.dependencies.serde_json]
version = "1.0"
default-features = false
features = ["raw_value"]

[workspace.dependencies.serde_regex]
version = "1.1"

[workspace.dependencies.serde_yaml]
version = "0.9"

[workspace.dependencies.sha1]
version = "0.10"
default-features = false

[workspace.dependencies.sha2]
version = "0.10"
default-features = false

[workspace.dependencies.similar]
version = "2.7"

[workspace.dependencies.smallstr]
version = "0.3"
features = [
	"ffi",
	"serde",
	"std",
	"union",
]

[workspace.dependencies.smallvec]
version = "1.15"
features = [
	"const_generics",
	"const_new",
	"serde",
	"union",
	"write",
]

[workspace.dependencies.syn]
version = "2.0"
default-features = false
features = [
	"extra-traits",
	"full",
	"parsing",
	"proc-macro",
	"printing",
]

[workspace.dependencies.termimad]
version = "0.34"
default-features = false

[workspace.dependencies.thiserror]
version = "2.0"
default-features = false

[workspace.dependencies.tikv-jemallocator]
git = "https://github.com/matrix-construct/jemallocator"
rev = "03bed96afbbc898bef4d4f7d335c0519e3d1afad"
default-features = false
features = [
	"background_threads_runtime_support",
	"unprefixed_malloc_on_supported_platforms",
]

[workspace.dependencies.tikv-jemalloc-ctl]
git = "https://github.com/matrix-construct/jemallocator"
rev = "03bed96afbbc898bef4d4f7d335c0519e3d1afad"
default-features = false
features = ["use_std"]

[workspace.dependencies.tikv-jemalloc-sys]
git = "https://github.com/matrix-construct/jemallocator"
rev = "03bed96afbbc898bef4d4f7d335c0519e3d1afad"
default-features = false
features = [
	"background_threads_runtime_support",
	"unprefixed_malloc_on_supported_platforms",
]

[workspace.dependencies.tokio]
version = "1.48"
default-features = false
features = [
	"fs",
	"net",
	"macros",
	"sync",
	"signal",
	"time",
	"rt-multi-thread",
	"io-util",
	"tracing",
]

[workspace.dependencies.tokio-metrics]
version = "0.4"

[workspace.dependencies.toml]
version = "0.9"
default-features = false
features = ["parse"]

[workspace.dependencies.tower]
version = "0.5"
default-features = false
features = ["util"]

[workspace.dependencies.tower-http]
version = "0.6"
default-features = false
features = [
    "add-extension",
    "catch-panic",
    "cors",
    "sensitive-headers",
    "set-header",
    "timeout",
    "trace",
    "util",
]

[workspace.dependencies.tracing]
version = "0.1"
default-features = false

[workspace.dependencies.tracing-core]
version = "0.1"
default-features = false

[workspace.dependencies.tracing-flame]
version = "0.2"

[workspace.dependencies.tracing-opentelemetry]
version = "0.32"

[workspace.dependencies.tracing-subscriber]
version = "0.3"
default-features = false
features = [
	"ansi",
	"env-filter",
	"fmt",
	"std",
	"tracing",
	"tracing-log",
]

[workspace.dependencies.url]
version = "2.5"
default-features = false
features = ["serde"]

[workspace.dependencies.webpage]
version = "2.0"
default-features = false

#
# Patches
#

# adds a tab completion callback:
# https://github.com/girlbossceo/rustyline-async/commit/de26100b0db03e419a3d8e1dd26895d170d1fe50
# adds event for CTRL+\:
# https://github.com/girlbossceo/rustyline-async/commit/67d8c49aeac03a5ef4e818f663eaa94dd7bf339b
[patch.crates-io.rustyline-async]
git = "https://github.com/matrix-construct/rustyline-async"
rev = "ba743cae940659e95d7b8604bbd6fdd755171c8c"

# adds LIFO queue scheduling; this should be updated with PR progress.
[patch.crates-io.event-listener]
git = "https://github.com/matrix-construct/event-listener"
rev = "fe4aebeeaae435af60087ddd56b573a2e0be671d"
[patch.crates-io.async-channel]
git = "https://github.com/matrix-construct/async-channel"
rev = "92e5e74063bf2a3b10414bcc8a0d68b235644280"

# adds affinity masks for selecting more than one core at a time
[patch.crates-io.core_affinity]
git = "https://github.com/matrix-construct/core_affinity_rs"
rev = "ff148c2985cbaff3e6e953d45cda4d7696f38d75"

# reverts hyperium#148 conflicting with our delicate federation resolver hooks
[patch.crates-io.hyper-util]
git = "https://github.com/matrix-construct/hyper-util"
rev = "c4fd9b4cd3a59fcfd28ca3802d68a8ea8988d9a3"

# allows no-aaaa option in resolv.conf
# bumps rust edition and toolchain to 1.86.0 and 2024
# use sat_add on line number errors
[patch.crates-io.resolv-conf]
git = "https://github.com/matrix-construct/resolv-conf"
rev = "200e958941d522a70c5877e3d846f55b5586c68d"

#
# Our crates
#

[workspace.dependencies.tuwunel-router]
package = "tuwunel_router"
path = "src/router"
default-features = false

[workspace.dependencies.tuwunel-admin]
package = "tuwunel_admin"
path = "src/admin"
default-features = false

[workspace.dependencies.tuwunel-api]
package = "tuwunel_api"
path = "src/api"
default-features = false

[workspace.dependencies.tuwunel-service]
package = "tuwunel_service"
path = "src/service"
default-features = false

[workspace.dependencies.tuwunel-database]
package = "tuwunel_database"
path = "src/database"
default-features = false

[workspace.dependencies.tuwunel-core]
package = "tuwunel_core"
path = "src/core"
default-features = false

[workspace.dependencies.tuwunel-macros]
package = "tuwunel_macros"
path = "src/macros"
default-features = false

###############################################################################
#
# Release profiles
#

[profile.release]
strip = "symbols"
lto = "thin"

# release profile with debug symbols
[profile.release-debuginfo]
inherits = "release"
debug = "full"
strip = "none"

# do not use without profile-rustflags enabled. uncomment ALL the sections for
# profile.release-native
[profile.release-native]
inherits = "release"
strip = "symbols"
lto = "fat"
#rustflags = [
#	'-Ctarget-cpu=native',
#	'-Ztune-cpu=native',
#	'-Ctarget-feature=+crt-static',
#	'-Crelocation-model=static',
#	'-Ztls-model=local-exec',
#	'-Zinline-mir=true',
#	'-Zmir-opt-level=3',
#	'-Clink-arg=-Wl,--gc-sections',
#	'-Ztime-passes',
#	'-Ztime-llvm-passes',
#]

[profile.release-native.build-override]
inherits = "release-native"
opt-level = 0
codegen-units = 32
#rustflags = [
#	'-Crelocation-model=pic',
#	'-Ctarget-feature=-crt-static',
#	'-Clink-arg=-Wl,--no-gc-sections',
#]

[profile.release-native.package.tuwunel_macros]
inherits = "release-native.build-override"
#rustflags = [
#	'-Crelocation-model=pic',
#	'-Ctarget-feature=-crt-static',
#]

[profile.bench]
debug = "limited"
strip = "none"
#rustflags = [
#	"-Cremark=all",
#	'-Ztime-passes',
#	'-Ztime-llvm-passes',
#]

###############################################################################
#
# Developer profile
#

# To enable hot-reloading:
# 1. Uncomment all of the rustflags here.
# 2. Uncomment crate-type=dylib in src/*/Cargo.toml
#
# opt-level, mir-opt-level, validate-mir are not known to interfere with reloading
# and can be raised if build times are tolerable.

[profile.dev]
debug = 0
#rustflags = [
#	'--cfg', 'tuwunel_mods',
#	'-Ztime-passes',
#	'-Zmir-opt-level=0',
#	'-Zvalidate-mir=false',
#	'-Ztls-model=global-dynamic',
#	'-Cprefer-dynamic=true',
#	'-Zstaticlib-prefer-dynamic=true',
#	'-Zstaticlib-allow-rdylib-deps=true',
#	'-Zpacked-bundled-libs=false',
#	'-Zplt=true',
#	'-Crpath=true',
#	'-Clink-arg=-Wl,--as-needed',
#	'-Clink-arg=-Wl,--allow-shlib-undefined',
#	'-Clink-arg=-Wl,-z,keep-text-section-prefix',
#	'-Clink-arg=-Wl,-z,lazy',
#]

[profile.dev.package.tuwunel_core]
inherits = "dev"
incremental = false
#rustflags = [
#	'--cfg', 'tuwunel_mods',
#	'-Ztime-passes',
#	'-Zmir-opt-level=0',
#	'-Ztls-model=initial-exec',
#	'-Cprefer-dynamic=true',
#	'-Zstaticlib-prefer-dynamic=true',
#	'-Zstaticlib-allow-rdylib-deps=true',
#	'-Zpacked-bundled-libs=false',
#	'-Zplt=true',
#	'-Clink-arg=-Wl,--as-needed',
#	'-Clink-arg=-Wl,--allow-shlib-undefined',
#	'-Clink-arg=-Wl,-z,lazy',
#	'-Clink-arg=-Wl,-z,unique',
#	'-Clink-arg=-Wl,-z,nodlopen',
#	'-Clink-arg=-Wl,-z,nodelete',
#]

[profile.dev.package.tuwunel]
inherits = "dev"
#rustflags = [
#	'--cfg', 'tuwunel_mods',
#	'-Ztime-passes',
#	'-Zmir-opt-level=0',
#	'-Zvalidate-mir=false',
#	'-Ztls-model=global-dynamic',
#	'-Cprefer-dynamic=true',
#	'-Zexport-executable-symbols=true',
#	'-Zplt=true',
#	'-Crpath=true',
#	'-Clink-arg=-Wl,--as-needed',
#	'-Clink-arg=-Wl,--allow-shlib-undefined',
#	'-Clink-arg=-Wl,--export-dynamic',
#	'-Clink-arg=-Wl,-z,lazy',
#]

[profile.dev.package.'*']
inherits = "dev"
debug = 0
incremental = false
codegen-units = 1
opt-level = 'z'
#rustflags = [
#	'--cfg', 'tuwunel_mods',
#	'-Ztls-model=global-dynamic',
#	'-Cprefer-dynamic=true',
#	'-Zstaticlib-prefer-dynamic=true',
#	'-Zstaticlib-allow-rdylib-deps=true',
#	'-Zpacked-bundled-libs=true',
#	'-Zplt=true',
#	'-Clink-arg=-Wl,--as-needed',
#	'-Clink-arg=-Wl,-z,lazy',
#	'-Clink-arg=-Wl,-z,nodelete',
#]

# same as dev but slower.
[profile.dbg]
inherits = "dev"
debug = "full"

# primarily used for CI
[profile.test]
debug = "limited"

[profile.test.package.'*']
inherits = "test"
incremental = false
codegen-units = 1
opt-level = 'z'

###############################################################################
#
# Linting
#

[workspace.lints.rust]
absolute-paths-not-starting-with-crate = "warn"
#box-pointers = "warn"
deprecated-in-future = "warn"
elided-lifetimes-in-paths = "warn"
explicit-outlives-requirements = "warn"
ffi-unwind-calls = "warn"
keyword-idents = "warn"
macro-use-extern-crate = "warn"
meta-variable-misuse = "warn"
missing-abi = "warn"
#missing-copy-implementations = "warn"                               # TODO
#missing-debug-implementations = "warn"                              # TODO
non-ascii-idents = "warn"
rust-2021-incompatible-closure-captures = "warn"
rust-2021-incompatible-or-patterns = "warn"
rust-2021-prefixes-incompatible-syntax = "warn"
rust-2021-prelude-collisions = "warn"
single-use-lifetimes = "warn"
trivial-casts = "warn"
trivial-numeric-casts = "warn"
unit-bindings = "warn"
#unnameable-types = "warn"                                           # TODO
unreachable-pub = "warn"
unsafe-op-in-unsafe-fn = "warn"
unstable-features = "warn"
unused-extern-crates = "warn"
unused-import-braces = "warn"
unused-lifetimes = "warn"
unused-macro-rules = "warn"
unused-qualifications = "warn"
#unused-results = "warn"                                             # TODO

## some sadness
elided_named_lifetimes = "allow"                                     # TODO!
mismatched_lifetime_syntaxes = "allow"                               # TODO!
let_underscore_drop = "allow"
missing_docs = "allow"
# cfgs cannot be limited to expected cfgs or their de facto non-transitive/opt-in use-case e.g.
# tokio_unstable will warn.
unexpected_cfgs = "allow"
# this seems to suggest broken code and is not working correctly
unused_braces = "allow"
# buggy, but worth checking on occasionally
unused_crate_dependencies = "allow"
unsafe_code = "allow"
variant_size_differences = "allow"

# we check nightly clippy lints
unknown_lints = "allow"

# rust claims elided_named_lifetimes has been replaced by
# mismatched_lifetime_syntaxes but it actually has not.
renamed_and_removed_lints = "allow"

# nightly has a new lint that conflicts with our BoolExt trait at
# src/core/utils/bool.rs:68:48
# <https://github.com/rust-lang/rust/issues/142748>
unstable_name_collisions = "allow"                                   # TODO

#######################################
#
# Clippy lints
#

[workspace.lints.clippy]

###################
cargo = { level = "warn", priority = -1 }

## some sadness
multiple_crate_versions = { level = "allow", priority = 1 }

###################
complexity = { level = "warn", priority = -1 }

# promotes forward-compat for literal ..default() construction
needless_update = { level = "allow", priority = 1 }

###################
correctness = { level = "warn", priority = -1 }

###################
nursery = { level = "warn", priority = -1 }

## some sadness
missing_const_for_fn = { level = "allow", priority = 1 }             # TODO
option_if_let_else = { level = "allow", priority = 1 }               # TODO
redundant_pub_crate = { level = "allow", priority = 1 }              # TODO
significant_drop_in_scrutinee = { level = "allow", priority = 1 }    # TODO
significant_drop_tightening = { level = "allow", priority = 1 }      # TODO
tuple_array_conversions = { level = "allow", priority = 1 }

###################
pedantic = { level = "warn", priority = -1 }

## some sadness
too_long_first_doc_paragraph = { level = "allow", priority = 1 }
default_trait_access = { level = "allow", priority = 1 }
doc_markdown = { level = "allow", priority = 1 }
enum_glob_use = { level = "allow", priority = 1 }
if_not_else = { level = "allow", priority = 1 }
if_then_some_else_none = { level = "allow", priority = 1 }
inline_always = { level = "allow", priority = 1 }
map_unwrap_or = { level = "allow", priority = 1 }
match_bool = { level = "allow", priority = 1 }
match_same_arms = { level = "allow", priority = 1 }
missing_docs_in_private_items = { level = "allow", priority = 1 }
missing_errors_doc = { level = "allow", priority = 1 }
missing_panics_doc = { level = "allow", priority = 1 }
module_name_repetitions = { level = "allow", priority = 1 }
needless_continue = { level = "allow", priority = 1 }
no_effect_underscore_binding = { level = "allow", priority = 1 }
similar_names = { level = "allow", priority = 1 }
single_match_else = { level = "allow", priority = 1 }
struct_excessive_bools = { level = "allow", priority = 1 }
struct_field_names = { level = "allow", priority = 1 }
unnecessary_wraps = { level = "allow", priority = 1 }
unused_async = { level = "allow", priority = 1 }

###################
perf = { level = "warn", priority = -1 }

###################
#restriction = "warn"

#allow_attributes = "warn"                                           # UNSTABLE
arithmetic_side_effects = "warn"
as_conversions = "warn"
as_underscore = "warn"
assertions_on_result_states = "warn"
dbg_macro = "warn"
default_union_representation = "warn"
deref_by_slicing = "warn"
empty_drop = "warn"
empty_structs_with_brackets = "warn"
exit = "warn"
filetype_is_file = "warn"
float_cmp_const = "warn"
fn_to_numeric_cast_any = "warn"
format_push_string = "warn"
get_unwrap = "warn"
impl_trait_in_params = "warn"
let_underscore_untyped = "warn"
lossy_float_literal = "warn"
mem_forget = "warn"
missing_assert_message = "warn"
mutex_atomic = "warn"
pub_without_shorthand = "warn"
rc_buffer = "warn"
rc_mutex = "warn"
redundant_type_annotations = "warn"
semicolon_outside_block = "warn"
str_to_string = "warn"
string_lit_chars_any = "warn"
string_slice = "warn"
implicit_clone = "warn"
suspicious_xor_used_as_pow = "warn"
tests_outside_test_module = "warn"
try_err = "warn"
undocumented_unsafe_blocks = "warn"
unnecessary_safety_comment = "warn"
unnecessary_safety_doc = "warn"
unnecessary_self_imports = "warn"
unneeded_field_pattern = "warn"
unseparated_literal_suffix = "warn"
#unwrap_used = "warn"                                                # TODO
verbose_file_reads = "warn"

###################
style = { level = "warn", priority = -1 }

## some sadness
# trivial assertions are quite alright
assertions_on_constants = { level = "allow", priority = 1 }
module_inception = { level = "allow", priority = 1 }
obfuscated_if_else = { level = "allow", priority = 1 }
collapsible_if = { level = "allow", priority = 1 }                   # TODO stable v. nightly 05-21-25

###################
suspicious = { level = "warn", priority = -1 }

## some sadness
let_underscore_future = { level = "allow", priority = 1 }

# rust doesnt understand tuwunel's custom log macros
literal_string_with_formatting_args = { level = "allow", priority = 1 }
