Down from 29 warnings to 2, in the spirit of 4ab95ff.
The doc warnings were all one mistake made repeatedly: a paragraph wrapped so
that a line *began* with `- ` or `+ `, which rustdoc reads as a markdown list
marker and the following lines as unindented continuations. The prose always
meant an em-dash. Fixed by moving the dash to the end of the previous line and
re-wrapping; not one word changed, which is the point - these comments record
things confirmed against real printers and are worth more than the warning.
The genuine lists just had their continuations de-indented and stayed lists.
The code ones are `match x { V(v) => .., _ => {} }` to `if let`, and nested
`if let Some(x) = .. { if cond { .. } }` to a let-chain. None had an `else`,
so each is the same control flow written once instead of twice.
Two warnings are left deliberately, because fixing them is not cosmetic:
`AmsTray` (544 bytes against 32) and `BambuReport` (984 against 120) both have
one variant far larger than the rest. The fix clippy wants is a `Box`, which
changes how every reader of those enums is written and puts an allocation on
the push_status path that currently has none. Worth measuring before doing,
not worth doing to silence a warning.
51 tests still pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
78 lines
3.3 KiB
Rust
78 lines
3.3 KiB
Rust
//! Run with: cargo run --example printer_polymorphism
|
|
//!
|
|
//! Demonstrates the trait+enum pattern that stands in for inheritance:
|
|
//! - `connect()` is called the same way regardless of vendor (polymorphism),
|
|
//! but each variant's `impl GenericPrinter` runs completely different
|
|
//! code (override).
|
|
//! - `dispatch_gcode()` only exists on the Bambu struct (extension) - you
|
|
//! have to `match` the enum back down to the concrete type to reach it,
|
|
//! which is the trade-off for not having implicit downcasting.
|
|
|
|
use continuum_proxy::printer::{
|
|
BambuPrinter, BambuProtocolPreference, BambuTls, GenericPrinter, KlipperPrinter, PrinterHandle,
|
|
PrusaLinkPrinter, PrusaSerialPrinter,
|
|
};
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let mut fleet: Vec<PrinterHandle> = vec![
|
|
// Forced: a known-old printer.
|
|
PrinterHandle::Bambu(BambuPrinter::new(
|
|
"p1",
|
|
"P1S",
|
|
"192.168.1.49",
|
|
"87654321",
|
|
"01P00A000000000",
|
|
BambuTls::BundledCa,
|
|
BambuProtocolPreference::ForceV1,
|
|
)),
|
|
// Auto: the recommended default - see bambu.rs's doc comment.
|
|
PrinterHandle::Bambu(BambuPrinter::new(
|
|
"p2",
|
|
"X1 Carbon",
|
|
"192.168.1.50",
|
|
"12345678",
|
|
"00M00A000000000",
|
|
BambuTls::BundledCa,
|
|
BambuProtocolPreference::Auto,
|
|
)),
|
|
PrinterHandle::PrusaLink(PrusaLinkPrinter::new("p3", "MK4", "192.168.1.51", "prusa-api-key")),
|
|
PrinterHandle::PrusaSerial(PrusaSerialPrinter::new("p4", "MK3S+", "/dev/ttyACM0", 115_200)),
|
|
PrinterHandle::Klipper(KlipperPrinter::new("p5", "Voron 2.4", "192.168.1.52")),
|
|
// No host configured - this one will hit the Err path.
|
|
PrinterHandle::Klipper(KlipperPrinter::new("p6", "Broken Voron", "")),
|
|
];
|
|
|
|
// Uniform call site: every printer connects the same way from the
|
|
// caller's point of view, even though each variant's `connect()` body
|
|
// is an unrelated implementation.
|
|
for printer in &mut fleet {
|
|
match printer.connect().await {
|
|
Ok(()) => println!(" -> connected: {}\n", printer.display_name()),
|
|
Err(err) => println!(" -> failed: {err}\n"),
|
|
}
|
|
}
|
|
|
|
// Vendor-only extension: reachable only after matching the concrete
|
|
// variant back out of the enum - one arm now that Bambu is a single
|
|
// type regardless of which protocol version `connect()` settled on.
|
|
// `print_status()` is real Bambu-only behavior with no equivalent on
|
|
// `GenericPrinter` (no other vendor here has an in-memory report
|
|
// cache) - none of these connected above (fake IPs), so it's always
|
|
// `None`, but the point is the downcast, not a live reading.
|
|
for printer in &fleet {
|
|
if let PrinterHandle::Bambu(bambu) = printer {
|
|
println!(" {}: cached print_status = {:?}", bambu.sn, bambu.print_status().await)
|
|
}
|
|
}
|
|
|
|
// A second trait method, same uniform call site as connect(): every
|
|
// vendor sends "50%" a completely different way - an MQTT gcode
|
|
// command, Moonraker's native API, gcode over HTTP, gcode over serial
|
|
// - but the caller doesn't need to know or care which.
|
|
println!();
|
|
for printer in &mut fleet {
|
|
let _ = printer.set_fan_speed(50).await;
|
|
}
|
|
}
|