From 0c20fb86633104744dbccf30ad732296694fff1b Mon Sep 17 00:00:00 2001 From: Dawid Rycerz Date: Sun, 8 Feb 2026 12:44:10 +0100 Subject: Initial pipewire --- .cursorrules | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 .cursorrules (limited to '.cursorrules') diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..12b6201 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,166 @@ +# Rust Rules + +## 🧱 Project Architecture + +### **Modular Design** + +* Organize code into **crates** and **modules**: + + * Use a **workspace** for multi-crate projects (`Cargo.toml` + `Cargo.lock` at root). + * Split concerns into crates: e.g., `core`, `network`, `storage`, `cli`, `web`, `domain`, `infra`. +* Avoid monoliths β€” design for composability. + +### **Layered Architecture** + +Separate by **responsibility**, not technology: + +* **Domain layer** – business logic, domain models, pure logic, no dependencies. +* **Application layer** – use-cases, orchestrators, service interfaces. +* **Infrastructure layer** – database, HTTP clients, FS, external APIs. +* **Presentation layer** – CLI, gRPC, REST API, etc. + +Use traits to **abstract interfaces** between layers. + +--- + +## πŸ“¦ Crate and Module Hygiene + +### **Use Visibility Thoughtfully** + +* Keep as much private (`pub(crate)` or private) as possible. +* Use `mod.rs` sparingly β€” prefer flat `mod_x.rs` and `mod x;` where possible. +* Keep `lib.rs` or `main.rs` minimal β€” just wiring and top-level declarations. + +### **Predeclare your modules** + +Explicitly declare modules in parent files, avoiding implicit module discovery: + +```rust +mod domain; +mod services; +``` + +--- + +## 🧠 Code Design and Idioms + +### **Prefer Composition Over Inheritance** + +* Favor structs + traits over enums for extensibility. +* Use `impl Trait` for abstraction and `dyn Trait` for dynamic dispatch when needed. + +### **Minimize Unnecessary Abstractions** + +* Don't abstract over one implementation β€” wait for the second one. +* Don’t use traits where a simple function will do. + +### **Idiomatic Error Handling** + +* Use `Result`, `?`, and `thiserror` or `anyhow` (depending on layer). +* Business logic: custom error enums (`thiserror`). +* App layer or CLI: use `anyhow::Result` for bubble-up and crash-on-error. + +### **Zero-cost abstractions** + +* Use generics, lifetimes, borrowing, and ownership where appropriate. +* Minimize heap allocations, unnecessary `.clone()`s. + +## πŸ› οΈ Tooling and Dev Experience + +### **Use Clippy, Rustfmt, and IDEs** + +* `clippy`: catch non-idiomatic code. +* `rustfmt`: consistent formatting. +* `cargo-expand`: inspect macro-generated code. + +### **Use `cargo features` for Flexibility** + +* Feature-gate optional deps and functionalities: + +```toml +[features] +default = ["serde"] +cli = ["clap"] +``` + +## πŸ§ͺ Testing & Quality + +### **Test by Layer** + +* Unit tests for pure logic. +* Integration tests (`tests/`) for subsystems and public interfaces. +* End-to-end/system tests where applicable. + +Use `mockall` or `double` for mocking when interface testing is needed. + +### **Property-based test* Study open-source Rust projects like `ripgrep`, `tokio`, `tower`, `axum`, or `zellij`. + +* Use `proptest` for verifying correctness over ranges of inputs. + +## πŸ“ˆ Performance and Safety + +### **Measure Before Optimizing** + +* Use `cargo bench`, `criterion`, `perf`, or `flamegraph` for real profiling. +* Don't optimize until there's a clear need. + +### **Minimize Unsafe Code** + +* Keep `unsafe` blocks minimal, justified, and well-documented. +* Use crates like `bytemuck`, `zeroize`, or `unsafe-libyaml` only when needed. + +## πŸ“š Dependency Hygiene + +### **Minimal and Audited Dependencies** + +* Prefer well-maintained, minimal, audited crates. +* Avoid depending on "kitchen sink" crates unless unavoidable. +* Regularly check for security updates via `cargo audit`. + +## 🧾 Documentation & Maintainability + +### **Document Public APIs and Crates** + +* Use `//!` and `///` comments. +* Auto-generate docs with `cargo doc --open`. + +### **Conventional Naming** + +* Stick to Rust conventions: `snake_case` for functions and variables, `PascalCase` for types. + + +### **Limit Shared Mutable State** + +* Avoid global mutable state unless it’s guarded and justified. + +### **Reproducible Builds** + +* Pin versions where critical. +* Use lockfiles even in libraries (`[package] publish = false` in internal crates). + +## πŸ“ Example Folder Structure + +```text +my-app/ +β”œβ”€β”€ Cargo.toml +β”œβ”€β”€ Cargo.lock +β”œβ”€β”€ crates/ +β”‚ β”œβ”€β”€ core/ +β”‚ β”œβ”€β”€ api/ +β”‚ β”œβ”€β”€ domain/ +β”‚ └── storage/ +β”œβ”€β”€ bin/ +β”‚ └── cli.rs +β”œβ”€β”€ tests/ +β”‚ └── integration.rs +β”œβ”€β”€ docs/ +β”‚ └── architecture.md +``` + +## 🧭 Final Advice + +* Think in **lifetimes**, **ownership**, and **borrowing**. +* Design for **testability** and **composability**. +* Don't fight the compiler β€” **embrace it as your co-architect**. +* Be conservative with third-party crates β€” **audit and isolate** them if needed. +* This project is pure Unix - do not make any Windows adjustments. -- cgit v1.2.3