Files
mxaccessgw/docs/style-guides/ProtobufStyleGuide.md
T
2026-04-26 15:19:17 -04:00

65 lines
2.4 KiB
Markdown

# Protobuf Style Guide
This guide defines protobuf conventions for MXAccess Gateway public gRPC and
gateway-to-worker IPC contracts.
## Baseline
- Use `proto3`.
- Keep public gateway contracts and worker IPC contracts in separate `.proto`
files.
- Treat field numbers as permanent once released.
- Do not reuse removed field numbers or enum values. Reserve them.
- Keep generated code reproducible from checked-in `.proto` files.
## Source Documentation
- Maintain the existing documentation style in the `.proto` file and
surrounding contract docs.
- Write comments that include business-specific or domain-specific context when
that context is available from the contract, surrounding docs, or naming.
- Comment fields that carry MXAccess parity details, credential-sensitive data,
raw HRESULT/status information, or compatibility constraints.
- Avoid comments that restate field types or message nesting.
## Naming
- Use `snake_case` for package names, file names, field names, and enum values.
- Use `PascalCase` for message, enum, and service names.
- Prefix enum values with the enum name or a clear abbreviation to avoid name
collisions in generated languages.
- Keep MXAccess event family and command names recognizable in enum values.
## Compatibility
- Add fields instead of changing field meaning.
- Use `oneof` for command payloads, reply payloads, value unions, and event
bodies.
- Add explicit `UNKNOWN` or `UNSPECIFIED` enum zero values.
- Preserve raw HRESULT, MXAccess status, and diagnostic metadata in replies and
events.
- Use protocol version fields in worker IPC envelopes.
## Field Rules
- Do not use required semantics in application code for newly added optional
fields unless compatibility behavior is documented.
- Prefer explicit wrapper messages for repeated structured values.
- Use signed or unsigned integer types based on the actual semantic range.
- Represent timestamps with `google.protobuf.Timestamp` unless the source value
is not a real timestamp.
- Represent durations with `google.protobuf.Duration`.
## Security
- Do not define fields that require clients or workers to log secrets.
- Mark credential-bearing request fields clearly in comments.
- Keep raw values out of diagnostics unless an explicit redacted or opt-in path
exists.
## Generated Code
- Do not hand-edit generated code.
- Keep generation commands documented near the contracts project.
- Regenerate all affected language outputs when a contract changes.