[package]
edition = "2024"
rust-version = "1.86"
name = "unifly-api"
version = "0.1.9"
authors = ["Stefanie Jane <stef@hyperbliss.tech>"]
build = false
autolib = false
autobins = false
autoexamples = false
autotests = false
autobenches = false
description = "Async Rust client, reactive data layer, and domain model for UniFi controller APIs"
documentation = "https://docs.rs/unifly-api"
readme = "README.md"
keywords = [
"unifi",
"ubiquiti",
"networking",
"api-client",
"async",
]
categories = [
"api-bindings",
"network-programming",
]
license = "Apache-2.0"
repository = "https://github.com/hyperb1iss/unifly"
[lib]
name = "unifly_api"
path = "src/lib.rs"
[[test]]
name = "integration_client_test"
path = "tests/integration_client_test.rs"
[[test]]
name = "legacy_client_test"
path = "tests/legacy_client_test.rs"
[dependencies.arc-swap]
version = "1"
[dependencies.async-stream]
version = "0.3"
[dependencies.bytes]
version = "1"
[dependencies.chrono]
version = "0.4"
features = [
"serde",
"clock",
]
default-features = false
[dependencies.dashmap]
version = "6"
[dependencies.futures-core]
version = "0.3"
[dependencies.futures-util]
version = "0.3"
[dependencies.reqwest]
version = "0.12"
features = [
"json",
"cookies",
"rustls-tls",
"gzip",
"brotli",
]
default-features = false
[dependencies.rustls]
version = "0.23"
features = [
"ring",
"std",
"tls12",
]
default-features = false
[dependencies.rustls-pki-types]
version = "1"
[dependencies.secrecy]
version = "0.10"
features = ["serde"]
[dependencies.serde]
version = "1"
features = [
"derive",
"rc",
]
[dependencies.serde_json]
version = "1"
[dependencies.strum]
version = "0.26"
features = ["derive"]
[dependencies.thiserror]
version = "2"
[dependencies.tokio]
version = "1"
features = [
"sync",
"time",
"rt",
"macros",
"rt",
]
[dependencies.tokio-stream]
version = "0.1"
features = ["sync"]
[dependencies.tokio-tungstenite]
version = "0.26"
features = ["rustls-tls-webpki-roots"]
[dependencies.tokio-util]
version = "0.7"
[dependencies.tracing]
version = "0.1"
[dependencies.url]
version = "2"
features = ["serde"]
[dependencies.uuid]
version = "1"
features = [
"serde",
"v4",
]
[dev-dependencies.insta]
version = "1"
features = [
"json",
"yaml",
"redactions",
]
[dev-dependencies.tempfile]
version = "3"
[dev-dependencies.tokio]
version = "1"
features = [
"sync",
"time",
"rt",
"test-util",
]
[dev-dependencies.tokio-test]
version = "0.4"
[dev-dependencies.wiremock]
version = "0.6"
[lints.clippy.all]
level = "deny"
priority = 0
[lints.clippy.as_conversions]
level = "warn"
priority = 22
[lints.clippy.cast_possible_truncation]
level = "warn"
priority = 22
[lints.clippy.cast_precision_loss]
level = "warn"
priority = 22
[lints.clippy.cast_sign_loss]
level = "warn"
priority = 22
[lints.clippy.cloned_instead_of_copied]
level = "warn"
priority = 36
[lints.clippy.cognitive_complexity]
level = "warn"
priority = 34
[lints.clippy.dbg_macro]
level = "warn"
priority = 31
[lints.clippy.doc_markdown]
level = "allow"
priority = 21
[lints.clippy.enum_glob_use]
level = "deny"
priority = 30
[lints.clippy.flat_map_option]
level = "warn"
priority = 36
[lints.clippy.from_iter_instead_of_collect]
level = "warn"
priority = 36
[lints.clippy.future_not_send]
level = "warn"
priority = 32
[lints.clippy.if_not_else]
level = "warn"
priority = 36
[lints.clippy.implicit_clone]
level = "warn"
priority = 33
[lints.clippy.inefficient_to_string]
level = "warn"
priority = 33
[lints.clippy.manual_let_else]
level = "warn"
priority = 36
[lints.clippy.match_same_arms]
level = "warn"
priority = 36
[lints.clippy.missing_docs_in_private_items]
level = "allow"
priority = 20
[lints.clippy.missing_errors_doc]
level = "allow"
priority = 20
[lints.clippy.missing_panics_doc]
level = "allow"
priority = 20
[lints.clippy.missing_safety_doc]
level = "allow"
priority = 20
[lints.clippy.module_name_repetitions]
level = "allow"
priority = 21
[lints.clippy.multiple_crate_versions]
level = "allow"
priority = 40
[lints.clippy.must_use_candidate]
level = "allow"
priority = 21
[lints.clippy.needless_continue]
level = "warn"
priority = 36
[lints.clippy.needless_pass_by_value]
level = "warn"
priority = 36
[lints.clippy.out_of_bounds_indexing]
level = "deny"
priority = 30
[lints.clippy.pedantic]
level = "deny"
priority = 10
[lints.clippy.perf]
level = "deny"
priority = 1
[lints.clippy.redundant_else]
level = "warn"
priority = 36
[lints.clippy.result_large_err]
level = "warn"
priority = 35
[lints.clippy.return_self_not_must_use]
level = "allow"
priority = 21
[lints.clippy.semicolon_if_nothing_returned]
level = "warn"
priority = 36
[lints.clippy.significant_drop_tightening]
level = "allow"
priority = 21
[lints.clippy.string_lit_as_bytes]
level = "warn"
priority = 33
[lints.clippy.style]
level = "warn"
priority = 1
[lints.clippy.todo]
level = "warn"
priority = 31
[lints.clippy.too_many_lines]
level = "warn"
priority = 34
[lints.clippy.trivially_copy_pass_by_ref]
level = "warn"
priority = 36
[lints.clippy.undocumented_unsafe_blocks]
level = "deny"
priority = 30
[lints.clippy.unwrap_used]
level = "deny"
priority = 30
[lints.rust]
unsafe_code = "forbid"