# codetics-ocpp201
Every OCPP 2.0.1 (Edition 4) message as plain Rust types. Type names are the specification datatype names
without their `Type` suffix (`ChargingProfileType` → `ChargingProfile`).
- `serde` mappings matching the message definitions; `customData` extensions are preserved;
- `Validate` implementations for length, range and cardinality constraints, with violations mapped to OCPP-J error codes;
- `Action` with message direction, and typed dispatch: `StationCall` (Charging Station → CSMS) and `CsmsCall` (CSMS → Charging Station).
```rust
use codetics_ocpp201::StationCall;
let p = r#"{"reason":"PowerUp","chargingStation":{"model":"SingleSocketCharger","vendorName":"VendorX"}}"#;
let StationCall::BootNotification(boot) = StationCall::decode("BootNotification", p).unwrap() else { unreachable!() };
assert_eq!(boot.charging_station.vendor_name, "VendorX");
```
## Part of Codetics OCPP
This crate belongs to [Codetics OCPP](https://codetics.fr), a complete OCPP 1.6J / 2.0.1 / 2.1
implementation in Rust written by **Kevin Vavelin** ([Codetics](https://codetics.fr)).
It can be used as is; contributions are welcome.
## License and credit
Licensed under the [Apache License, Version 2.0](LICENSE).
Copyright 2026 Kevin Vavelin, Codetics. Any redistribution of this crate or of a work derived
from it (including forks and products embedding it) must keep the copyright notice and include
the [NOTICE](NOTICE) file crediting Kevin Vavelin / Codetics as the origin of the work.