1 use {Event, Input};
2 
3 /// Close arguments.
4 #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deserialize, Serialize, Hash)]
5 pub struct CloseArgs;
6 
7 /// Window is closing.
8 pub trait CloseEvent: Sized {
9     /// Creates a close event from arguments.
10     ///
11     /// Preserves time stamp from original input event, if any.
from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>12     fn from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>;
13     /// Calls closure if this is a close event.
close<U, F>(&self, f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U14     fn close<U, F>(&self, f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U;
15     /// Returns close arguments.
close_args(&self) -> Option<CloseArgs>16     fn close_args(&self) -> Option<CloseArgs> {
17         self.close(|args| args.clone())
18     }
19 }
20 
21 impl CloseEvent for Event {
from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self>22     fn from_close_args(args: &CloseArgs, old_event: &Self) -> Option<Self> {
23         let timestamp = if let Event::Input(_, x) = old_event {*x} else {None};
24         Some(Event::Input(Input::Close(*args), timestamp))
25     }
26 
close<U, F>(&self, mut f: F) -> Option<U> where F: FnMut(&CloseArgs) -> U27     fn close<U, F>(&self, mut f: F) -> Option<U>
28         where F: FnMut(&CloseArgs) -> U
29     {
30         match *self {
31             Event::Input(Input::Close(ref args), _) => Some(f(args)),
32             _ => None,
33         }
34     }
35 }
36 
37 #[cfg(test)]
38 mod tests {
39     use super::*;
40 
41     #[test]
test_input_close()42     fn test_input_close() {
43         use CloseArgs;
44         use Event;
45 
46         let e: Event = CloseArgs.into();
47         let x: Option<Event> = CloseEvent::from_close_args(&CloseArgs, &e);
48         let y: Option<Event> = x.clone()
49             .unwrap()
50             .close(|args| CloseEvent::from_close_args(args, x.as_ref().unwrap()))
51             .unwrap();
52         assert_eq!(x, y);
53     }
54 }
55