Coding Style

This document describes the coding style used by this project. All of the formatters can be invoked by the pw utility script in the root of the project:

$ ./pw format

Rust

This project follows the standard Rust Style Guide for Rust code. Formatting is done with rustfmt using the rustfmt.toml from the upstream Pigweed repository.

Beyond formatting, openprot is embedded, security-critical firmware and review enforces the following constraints. See .github/copilot-instructions.md for the full list.

  • no_std only. No heap types (Vec, String, HashMap, Box). Use fixed-size arrays and heapless collections.
  • Panic-free. No unwrap, expect, panic!, or direct [] indexing in production paths. Prefer get(), pattern matching, or returning Result / Option.
  • Checked arithmetic. Use checked_* / saturating_* / wrapping_* rather than bare +, -, * on integers where overflow is possible.
  • Volatile MMIO. Register access uses read_volatile / write_volatile and must go through HAL traits rather than touching registers directly.
  • unsafe blocks require // SAFETY: comments that explain why the invariants hold.
  • Constant-time crypto. Use subtle for comparing secrets, and zeroize to bound the lifetime of secret material in memory.

Python

This project follows PEP8 for Python code. Formatting is done with the black formatter.

Starlark (bazel build system)

This project follows the standard bzl style guide for Starlark code. Formatting is done with the buildifier tool.

C / C++

This project follows the [Google C++ Style Guide] for C and C++ code, with the following exceptions:

  • Indent is 4 spaces instead of 2.
  • Function names should use snake_case instead of PascalCase.
  • In pointer declarations, the asterisk is attached to the variable name (int *foo) instead of the type name (int* foo).

Formatting is done with clang-format.