3 ms·
Re: associated data for a state, that's possible too! trait StateData { type Data; } struct Sender<const S: SenderState> { ... // sender impleme
by cdirkx 7y ago
Re: associated data for a state, that's possible too!
trait StateData {
type Data;
}
struct Sender<const S: SenderState> {
... // sender implementation
state_data: <Self as StateData>::Data
}
impl<const S: SenderState> StateData for Sender<{S}> {
// default: no associated data
default type Data = ();
}
struct HasSentNumberData {
sent: u32
}
// using a specialized impl (also an unstable feature).
impl StateData for Sender<{SenderState::HasSentNumber}> {
// instead of a complete struct we could also have done Data = u32,
// but a separate struct would enable a nicer constructor, default values, helper methods and so on.
// (ommitted in this example though)
type Data = HasSentNumberData;
}
struct HasReceivedNumberData {
sent: u32,
received: u32
}
impl StateData for Sender<{SenderState::HasReceivedNumber}> {
type Data = HasReceivedNumberData;
}
Example usage:
impl Sender<{SenderState::HasReceivedNumber}> {
...
fn validate_received_number(&self) -> bool {
self.state_data.received == self.state_data.sent
}
}
let sender = Sender::<{SenderState::HasReceivedNumber}> { state_data: HasReceivedNumberData { sent: 3, received: 28 } };
assert_eq!(sender.validate_received_number() == false) // client sent wrong number!
Playground link to see this in action: https://play.rust-lang.org/?version=nightly&mode=release&edition=2018&gist=81ee6b0f97b214b59fe1d08259c88ee8 https://play.rust-lang.org/?version=nightly&mode=release&edi...