NLinker icon

Vector of polymorphic boxes with dyn trait

NLinker | PRO | 04/21/20 08:40:20 AM UTC | 0 ⭐ | 8532 👁️ | Never ⏰ | []
Rust |

1.21 KB

|

None

|

0 👍

/

0 👎

// https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=7ccac7cdf77cbc63a7d6fabd75a8b86e
 
struct Message;
 
trait Filter {
    type Checking;
    fn check(&self, to_check: &Self::Checking) -> bool;
}
 
struct SomeFilter<T> {
    handler: fn(&T) -> bool,
}
 
impl<T> Filter for SomeFilter<T> {
    type Checking = T;
    fn check(&self, to_check: &Self::Checking) -> bool {
        (self.handler)(to_check)
    }
}
 
struct Handler<T> {
    filters: Vec<Box<dyn Filter<Checking = T>>>,
    handler: fn(&T) -> bool,
}
 
impl<T> Handler<T> {
    fn run(&self, message: &T) -> Option<bool> {
        for filter in &self.filters {
            let _result = filter.check(message);
            if !_result {
                return None;
            }
        }
 
        Some((self.handler)(message))
    }
}
 
fn main() {
    let filter_always_true = Box::new(SomeFilter {
        handler: |_msg: &Message| true,
    }) as Box<dyn Filter<Checking=Message>>;
    
    let filters = vec![filter_always_true];
    let msg_handler = Handler::<Message> {
        filters: filters,
        handler: |_msg: &Message| true,
    };
 
    println!("{}", msg_handler.run(&Message {}).unwrap());
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎