Skip to main content
This guide extends the Microsoft Rust Guidelines with BoxLite-specific patterns.

External References

Universal Guidelines (Must Follow)

These guidelines from the Microsoft Rust Guidelines are particularly important for BoxLite:

Safety Guidelines

BoxLite-Specific Patterns

Async-First Architecture

All I/O operations use async/await with Tokio runtime:
Never use blocking I/O (e.g. std::fs) inside an async context. Always use the Tokio async equivalents (tokio::fs) to avoid blocking the runtime.

Centralized Error Handling

Use the BoxliteError enum for all errors (see boxlite-shared/src/errors.rs):
Always wrap errors with BoxliteError and include descriptive context about what operation failed and why. This makes debugging significantly easier.

Public Types Must Be Send + Sync

All public types exposed through the API must be thread-safe:

Formatting and Linting

  • Formatting: cargo fmt (enforced in CI)
  • Linting: cargo clippy (warnings are errors in CI)
Run before committing:

Quick Reference

When writing Rust code for BoxLite, ask yourself:
Only panic on programming errors (bugs). Use Result for all expected failures such as I/O errors, invalid input, or network issues.
Avoid vague weasel words like “Manager”, “Service”, and “Factory”. Choose names that describe what the type actually does.
Isolate and document all unsafe code in small, focused functions. Every unsafe block must explain why it is sound.
All public types must implement Debug. User-facing types should also implement Display.
All I/O operations should be async using Tokio. Never use blocking I/O inside an async context.
Use BoxliteError with descriptive messages. Every error should explain what went wrong and where.