Documentation
Rust Workspace Modernization - Summary
Overview
This document summarizes the modernization of Rust projects in the ad-blocking repository. All Rust projects have been unified into a single workspace with modern tooling and configuration.
What Changed
Before
-
3 separate Rust projects with independent configurations:
src/adguard-validation/(workspace with 2 crates)src/adguard-api-rust/(workspace with 2 crates)src/rules-compiler-rust/(single crate)
-
Inconsistent versions:
- Rust 1.75 (adguard-validation)
- Edition 2024 (adguard-api-rust, rules-compiler-rust)
- Edition 2021 (adguard-validation)
-
Duplicate dependencies: Each project declared its own dependency versions
-
No shared configuration: Each project had its own build settings
-
Separate CI jobs: Each project tested independently
After
-
Single unified workspace at repository root
-
5 workspace members:
adguard-validation-core- Core validation libraryadguard-validation-cli- Validation CLI tooladguard-api-lib- AdGuard DNS API client libraryadguard-api-cli- Interactive API CLIrules-compiler- Filter rules compiler
-
Consistent Rust 1.83 across all projects
-
Shared dependencies managed in root
Cargo.toml -
Unified configuration files for formatting, linting, and builds
-
Single CI job builds and tests all Rust projects
New Files Added
Configuration Files
-
Cargo.toml(root) - Workspace configuration- Defines 5 workspace members
- Centralizes dependency versions
- Sets workspace-wide metadata
- Configures release profile optimizations
-
rust-toolchain.toml- Toolchain specification- Rust 1.83 with rustfmt and clippy components
- Ensures consistent toolchain across environments
-
.cargo/config.toml- Build configuration- Cargo settings for builds
- Git CLI integration
- Profile overrides
-
.rustfmt.toml- Code formatting- 100-character line width
- Import reordering
- Unix line endings
- Stable-only features
-
clippy.toml- Linting configuration- Cognitive complexity threshold: 30
- Documentation enforcement
- Test-specific allowances
-
Cargo.lock- Locked dependencies- Ensures reproducible builds
- Version 4 lockfile format
Documentation Files
RUST_WORKSPACE.md- Comprehensive workspace guide- Quick start instructions
- Development workflows
- CI/CD integration
- Best practices
Modified Files
Workspace Configuration Updates
src/adguard-validation/Cargo.toml- Simplified to workspace referencesrc/adguard-api-rust/Cargo.toml- Simplified to workspace reference
Individual Crate Updates (All using workspace dependencies)
src/adguard-validation/adguard-validation-core/Cargo.tomlsrc/adguard-validation/adguard-validation-cli/Cargo.tomlsrc/adguard-api-rust/adguard-api-lib/Cargo.tomlsrc/adguard-api-rust/adguard-api-cli/Cargo.tomlsrc/rules-compiler-rust/Cargo.toml
Source Code (Formatting Only)
- All
.rsfiles formatted withcargo fmt - No functional changes
- Import reordering
- Consistent style
CI/CD Updates
.github/workflows/rust-clippy.yml- Enhanced for workspace- Added workspace-level build and test job
- Added formatting check
- Added dependency caching
- Changed from single-project to workspace clippy
Documentation Updates
README.md- Added workspace references and updated Rust sections
Benefits
Development Experience
✅ Single command builds: cargo build from root builds everything
✅ Faster builds: Shared build cache reduces compilation time
✅ Consistent tooling: Same Rust version everywhere
✅ Easier dependency updates: Update once, apply to all projects
Code Quality
✅ Unified formatting: cargo fmt --all formats all projects
✅ Consistent linting: Same clippy rules across all projects
✅ Workspace-level lints: Enforce best practices uniformly
✅ Better modularity: Easy to share code between projects
CI/CD
✅ Simpler workflows: One job tests all Rust code ✅ Better caching: Workspace-level dependency caching ✅ Faster CI: Parallel builds and shared cache ✅ Consistent checks: Same standards everywhere
Workspace Structure
ad-blocking/
├── Cargo.toml # Workspace root
├── Cargo.lock # Locked dependencies
├── rust-toolchain.toml # Rust 1.83
├── .cargo/
│ └── config.toml # Build settings
├── .rustfmt.toml # Formatting
├── clippy.toml # Linting
├── RUST_WORKSPACE.md # Documentation
└── src/
├── adguard-validation/
│ ├── adguard-validation-core/ # [Member 1]
│ │ ├── Cargo.toml
│ │ └── src/
│ └── adguard-validation-cli/ # [Member 2]
│ ├── Cargo.toml
│ └── src/
├── adguard-api-rust/
│ ├── adguard-api-lib/ # [Member 3]
│ │ ├── Cargo.toml
│ │ └── src/
│ └── adguard-api-cli/ # [Member 4]
│ ├── Cargo.toml
│ └── src/
└── rules-compiler-rust/ # [Member 5]
├── Cargo.toml
└── src/
Build Outputs
Debug Build (cargo build)
- Target:
target/debug/ - Compilation time: ~35-40 seconds
- Binary size: Unoptimized
Release Build (cargo build --release)
- Target:
target/release/ - Compilation time: ~85-90 seconds
- Binary size: Optimized with LTO
Binaries Produced
- adguard-validate (4.5 MB) - Validation CLI
- adguard-api-cli (3.7 MB) - API CLI
- rules-compiler (1.4 MB) - Rules compiler
- libadguard_validation.so (14 KB) - Validation library (FFI)
- libadguard_validation.a (56 MB) - Static library
- libadguard_api_lib.rlib (4.8 MB) - API library
- librules_compiler.rlib (722 KB) - Compiler library
Testing Results
Unit Tests
$ cargo test --workspace
running 25 tests
test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured
Integration Tests
running 1 test
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured
Doc Tests
running 4 tests
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured
Total: 30 tests passed
Linting Results
Clippy
$ cargo clippy --workspace --all-features
warning: unused import warnings (5 in adguard-validation-core)
warning: auto-generated code warnings (89 in adguard-api-lib)
Finished successfully
Formatting
$ cargo fmt --all -- --check
No formatting issues found
Migration Guide
For Developers
Before (old way still works):
cd src/rules-compiler-rust
cargo build
cargo test
After (recommended):
# From repository root
cargo build --workspace
cargo test --workspace
cargo build -p rules-compiler
For CI/CD
Before:
- name: Build rules-compiler
working-directory: ./src/rules-compiler-rust
run: cargo build
After:
- name: Build all Rust projects
run: cargo build --workspace
Common Commands
Building
# All projects
cargo build --workspace
# Release mode
cargo build --workspace --release
# Specific project
cargo build -p rules-compiler
cargo build -p adguard-api-cli
Testing
# All tests
cargo test --workspace
# Specific project
cargo test -p rules-compiler
# With output
cargo test --workspace -- --nocapture
Linting
# Check all projects
cargo clippy --workspace --all-features
# Fix issues
cargo clippy --workspace --fix --allow-dirty
Formatting
# Format all
cargo fmt --all
# Check formatting
cargo fmt --all -- --check
Running Binaries
# From root
cargo run -p rules-compiler -- --help
cargo run -p adguard-api-cli -- --version
cargo run -p adguard-validation-cli -- --help
# Release mode
cargo run --release -p rules-compiler -- -c config.yaml
Backward Compatibility
✅ All existing functionality preserved ✅ Individual projects can still be built independently ✅ No changes to binary behavior ✅ Same CLI interfaces ✅ Compatible with existing scripts and workflows
Future Improvements
Potential Enhancements
- Create shared utilities crate for common code
- Add workspace-level benchmarks
- Implement workspace-level examples
- Add more comprehensive integration tests
- Create workspace-level documentation generation
Dependency Updates
The workspace makes it easier to:
- Update dependencies across all projects
- Identify and remove unused dependencies
- Track security vulnerabilities
- Maintain consistent versions
Security
Workspace-Level Security Features
unsafe_code = "forbid"- No unsafe code allowed- Security scanning in CI/CD (CodeQL, clippy)
- Dependency auditing capability
- Locked dependencies for reproducibility
Performance
Build Performance
- First build: ~90 seconds (release mode)
- Incremental builds: ~5-10 seconds (unchanged dependencies)
- Parallel compilation: Enabled by default
- Shared cache: Reduces redundant compilations
Binary Size
All binaries are optimized with:
- LTO (Link-Time Optimization)
- Strip debug symbols
- Single codegen unit
- Panic = abort
Conclusion
The Rust workspace modernization provides:
- ✅ Better developer experience with unified tooling
- ✅ Improved code quality with consistent standards
- ✅ Faster CI/CD with better caching
- ✅ Easier maintenance with centralized configuration
- ✅ Full backward compatibility with existing workflows
All changes are non-breaking and enhance the project's modularity and maintainability.
Date: December 27, 2025 Rust Version: 1.83.0 Cargo Version: 1.83.0 Total Workspace Members: 5 Total Tests: 30 (all passing)