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

2.4 KiB

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.