autd3_driver/datagram/
with_segment.rs1use autd3_core::{
2 datagram::{
3 Datagram, DatagramOption, DatagramS, DeviceFilter, Inspectable, InspectionResult, Segment,
4 TransitionMode,
5 },
6 derive::FirmwareLimits,
7 environment::Environment,
8 geometry::Geometry,
9};
10
11use derive_more::Deref;
12
13#[derive(Deref, Debug, Clone, Copy, PartialEq, Eq, Hash)]
15pub struct WithSegment<D: DatagramS> {
16 #[deref]
17 pub inner: D,
19 pub segment: Segment,
21 pub transition_mode: Option<TransitionMode>,
23}
24
25impl<D: DatagramS> WithSegment<D> {
26 #[must_use]
28 pub const fn new(inner: D, segment: Segment, transition_mode: Option<TransitionMode>) -> Self {
29 Self {
30 inner,
31 segment,
32 transition_mode,
33 }
34 }
35}
36
37impl<D: DatagramS> Datagram for WithSegment<D> {
38 type G = D::G;
39 type Error = D::Error;
40
41 fn operation_generator(
42 self,
43 geometry: &Geometry,
44 env: &Environment,
45 filter: &DeviceFilter,
46 limits: &FirmwareLimits,
47 ) -> Result<Self::G, Self::Error> {
48 <D as DatagramS>::operation_generator_with_segment(
49 self.inner,
50 geometry,
51 env,
52 filter,
53 limits,
54 self.segment,
55 self.transition_mode,
56 )
57 }
58
59 fn option(&self) -> DatagramOption {
60 <D as DatagramS>::option(&self.inner)
61 }
62}
63
64#[doc(hidden)]
65pub trait InspectionResultWithSegment {
66 fn with_segment(self, segment: Segment, transition_mode: Option<TransitionMode>) -> Self;
67}
68
69impl<D> Inspectable for WithSegment<D>
70where
71 D: Inspectable + DatagramS,
72 D::Result: InspectionResultWithSegment,
73 <D as DatagramS>::Error: From<<D as Datagram>::Error>,
74{
75 type Result = D::Result;
76
77 fn inspect(
78 self,
79 geometry: &Geometry,
80 env: &Environment,
81 filter: &DeviceFilter,
82 limits: &FirmwareLimits,
83 ) -> Result<InspectionResult<Self::Result>, Self::Error> {
84 Ok(self
85 .inner
86 .inspect(geometry, env, filter, limits)?
87 .modify(|t| t.with_segment(self.segment, self.transition_mode)))
88 }
89}