pub struct MessageBuilder { /* private fields */ }Implementations§
Source§impl MessageBuilder
impl MessageBuilder
Sourcepub fn validate(&self) -> Result<()>
pub fn validate(&self) -> Result<()>
Validates the builder configuration without building the final Message.
This performs full validation of all fields:
- Checks that required fields (id, name, dlc, sender) are set
- Validates message-level constraints (DLC range, name not empty)
- Builds and validates all signals (overlap detection, bounds checking)
§Note
This method clones and builds all signals internally for validation.
If you only need the final Message, call build() directly.
Sourcepub fn build(self) -> Result<Message>
pub fn build(self) -> Result<Message>
Builds and validates the Message.
Consumes the builder and returns a fully constructed and validated Message.
§Errors
Returns an error if:
- Any required field (id, name, dlc, sender) is missing
- Name exceeds maximum length (32 characters)
- Any signal fails to build or validate
- Signals overlap in the message payload
- Signal extends beyond DLC bounds
§Examples
use dbc_rs::{MessageBuilder, SignalBuilder, ByteOrder, ReceiversBuilder};
let signal = SignalBuilder::new()
.name("RPM")
.start_bit(0)
.length(16)
.byte_order(ByteOrder::LittleEndian)
.unsigned(true)
.factor(1.0)
.offset(0.0)
.min(0.0)
.max(8000.0)
.receivers(ReceiversBuilder::new().none());
let message = MessageBuilder::new()
.id(0x100)
.name("EngineData")
.dlc(8)
.sender("ECM")
.add_signal(signal)
.build()?;
assert_eq!(message.name(), "EngineData");Source§impl MessageBuilder
impl MessageBuilder
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new MessageBuilder with no fields set.
§Examples
use dbc_rs::MessageBuilder;
let builder = MessageBuilder::new();
// Must set id, name, dlc, and sender before buildingSourcepub fn dlc(self, dlc: u8) -> Self
pub fn dlc(self, dlc: u8) -> Self
Sets the Data Length Code (DLC) - the number of data bytes in the message (0-8 for standard CAN, 0-64 for CAN FD).
Sourcepub fn sender(self, sender: impl AsRef<str>) -> Self
pub fn sender(self, sender: impl AsRef<str>) -> Self
Sets the sender (transmitter) ECU node name for this message.
Sourcepub fn add_signal(self, signal: SignalBuilder) -> Self
pub fn add_signal(self, signal: SignalBuilder) -> Self
Adds a signal to the message.
§Arguments
signal- ASignalBuilderto add to this message
§Examples
use dbc_rs::{MessageBuilder, SignalBuilder, ByteOrder};
let signal = SignalBuilder::new()
.name("EngineSpeed")
.start_bit(0)
.length(16)
.byte_order(ByteOrder::LittleEndian);
let builder = MessageBuilder::new()
.add_signal(signal);Sourcepub fn add_signals(
self,
signals: impl IntoIterator<Item = SignalBuilder>,
) -> Self
pub fn add_signals( self, signals: impl IntoIterator<Item = SignalBuilder>, ) -> Self
Adds multiple signals to the message.
§Arguments
signals- An iterator ofSignalBuilderitems to add
§Examples
use dbc_rs::{MessageBuilder, SignalBuilder, ByteOrder};
let signals = vec![
SignalBuilder::new().name("Signal1").start_bit(0).length(8).byte_order(ByteOrder::LittleEndian),
SignalBuilder::new().name("Signal2").start_bit(8).length(8).byte_order(ByteOrder::LittleEndian),
];
let builder = MessageBuilder::new()
.add_signals(signals);Sourcepub fn signals(self, signals: Vec<SignalBuilder>) -> Self
pub fn signals(self, signals: Vec<SignalBuilder>) -> Self
Replaces all signals in the message with the provided signals.
Clears any existing signals and adds the new ones.
§Arguments
signals- A vector ofSignalBuilderitems to set
§Examples
use dbc_rs::{MessageBuilder, SignalBuilder, ByteOrder};
let new_signals = vec![
SignalBuilder::new().name("NewSignal").start_bit(0).length(8).byte_order(ByteOrder::LittleEndian),
];
let builder = MessageBuilder::new()
.signals(new_signals);Sourcepub fn clear_signals(self) -> Self
pub fn clear_signals(self) -> Self
Removes all signals from the message.
§Examples
use dbc_rs::MessageBuilder;
let builder = MessageBuilder::new()
.clear_signals();