Expand description
§az-device-contract-codegen
Generate deterministic Modbus contract artifacts from typed service definitions.
- Crate:
az-device-contract-codegen - Local path:
creates/az-device-contract-codegen - Install:
cargo add az-device-contract-codegen
The crate plans a Modbus address layout, then emits a stable artifact bundle for:
- C headers and sources for RTU/TCP handlers
- Markdown protocol documents
- Rust client code built around
tokio-modbus
§Minimal usage
use az_device_contract_codegen::{
generate_bundle, ApiKind, ContractMethod, ContractRenderRequest, ContractService,
ContractTypedItem, ReadReturnKind, TransportKind, ValueType,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let request = ContractRenderRequest {
transports: vec![TransportKind::Rtu, TransportKind::Tcp],
services: vec![ContractService {
api_kind: ApiKind::RuntimeRead,
interface_name: "DeviceReadApi".into(),
interface_summary: Some("Runtime reads".into()),
methods: vec![ContractMethod {
summary: Some("Read signal lights".into()),
method_name: "getSignalLights".into(),
read_return_kind: Some(ReadReturnKind::Dto),
read_return_type_name: Some("SignalLights".into()),
read_area: None,
write_area: None,
read_fields: vec![
ContractTypedItem {
name: "ch1".into(),
summary: None,
value_type: ValueType::Boolean,
},
ContractTypedItem {
name: "ch2".into(),
summary: None,
value_type: ValueType::Boolean,
},
],
parameters: vec![],
}],
}],
};
let bundle = generate_bundle(&request)?;
for artifact in &bundle.artifacts {
println!("{}", artifact.relative_path.display());
}
Ok(())
}Typical output paths:
Core/Inc/generated/modbus/*.hCore/Src/generated/modbus/**/*.cDocs/generated/modbus/protocols/*.mdDocs/generated/modbus/rust/*.rs
§Default mapping rules
STATIC_READdefaults to input registers (0x04)RUNTIME_READ- all-boolean DTO/scalar reads default to discrete inputs (
0x02) - everything else defaults to input registers (
0x04)
- all-boolean DTO/scalar reads default to discrete inputs (
WRITE- all-boolean parameters default to coils (
0x05/0x0F) - everything else defaults to holding registers (
0x06/0x10)
- all-boolean parameters default to coils (
readArea and writeArea can override those defaults explicitly.
§Notes
- The crate itself does not write files; it returns
GeneratedArtifactvalues. - Generated Rust clients assume the consumer compiles them with
tokio-modbusandserialport. - Generated filenames and helper symbols currently use the existing
okm_*naming line used by this repository.
Structs§
- Contract
Method - Contract
Plan - Contract
Plan Error - Contract
Render Request - Contract
Service - Contract
Typed Item - Generated
Artifact - Generated
Bundle - Item
Plan - Method
Plan - Service
Summary
Enums§
- ApiKind
- Area
Kind - Artifact
Group - Method
Wire Kind - Planned
Value - Read
Return Kind - Register
Area - Transport
Kind - Value
Type