crossterm-rs / crossterm

Cross platform terminal library rust
MIT License
3.3k stars 280 forks source link

Add `is_*` and `as_*` methods to the event enums #949

Open joshka opened 4 days ago

joshka commented 4 days ago

Often application code only cares about a small subset of possible events. These methods make it simpler to write code which checks whether an event is a particular event type or converts events into the specific type (returning an Option).

This can help simplify some nested match blocks. E.g.:

match event {
    Event::Key(key) if key.kind == KeyEventKind::Press => { ... }
    _ => {}
}

becomes:

if let Some(key) = event.as_key_press() { ... }

Similar flexible methods are aded across all the event enums:

joshka commented 4 days ago

There is an in-flight PR in derive_more that would be also be useful. It adds an AsVariant derive. This would make it easy to deal with e.g. if let Some(mouse) = event.as_mouse() { ... } etc. I'd like to consider waiting for that and adding it to this PR.

Obviously a proper match statement is much better when dealing with more than one event type, but there are many use cases that this change would make simpler.