Format
Important
The design and implementation chapter is outdated
The untyped argument (=?) requires one level of indirection during serialization.
First let’s see how a primitive implements the Format trait:
#![allow(unused)]
fn main() {
extern crate defmt;
macro_rules! internp { ($l:literal) => { defmt::export::make_istr(0) } }
trait Format { fn format(&self, fmt: defmt::Formatter); }
impl Format for u8 {
fn format(&self, fmt: defmt::Formatter) {
let t = internp!("{=u8}");
defmt::export::istr(&t);
defmt::export::u8(self)
// on the wire: [1, 42]
// string index ^ ^^ `self`
}
}
}
Format will use the write! macro.
This will send the string index of {=u8} followed by the one-byte data.
In general, write! can use {=?} so Format nesting is possible.
Now let’s look into a log invocation:
#![allow(unused)]
fn main() {
extern crate defmt;
defmt::error!("The answer is {=?}!", 42u8);
// on the wire: [2, 1, 42]
// string index ^ ^^^^^ `42u8.format(/*..*/)`
// ^ = intern("The answer is {=?}!")
}
This will send the string index of “The answer is {:?}!” and invoke the argument’s Format::format method.