tinygame_core/core/
utils.rs1use std::sync::mpsc::{Receiver, Sender, channel};
2use std::ffi::CStr;
3
4use sdl3_sys::error::{SDL_ClearError, SDL_GetError};
5
6pub struct EventQueue<T> {
7 events: Vec<T>,
8 sender: Sender<T>,
9 receiver: Receiver<T>,
10}
11
12impl<T> EventQueue<T> {
13 pub fn new() -> Self {
14 let (sender, receiver) = channel();
15
16 Self {
17 events: Vec::new(),
18 sender,
19 receiver,
20 }
21 }
22 pub fn sender(&self) -> Sender<T> {
23 self.sender.clone()
24 }
25 pub fn clear(&mut self) {
26 self.events.clear();
27 }
28 pub fn collect(&mut self) {
29 for msg in self.receiver.try_iter() {
30 self.events.push(msg);
31 }
32 }
33 pub fn iter(&self)-> std::slice::Iter<'_, T> {
34 self.events.iter()
35 }
36 pub fn consume(&mut self) -> std::vec::IntoIter<T> {
37 std::mem::replace(&mut self.events, Vec::new()).into_iter()
38 }
39 pub fn len(&self)-> usize {
40 self.events.len()
41 }
42 pub fn has_events(&self) -> bool {
43 self.len() > 0
44 }
45}
46
47pub fn get_error() -> String {
48 unsafe {
49 let err_ptr = SDL_GetError();
50
51 if err_ptr.is_null() {
52 String::new()
53 } else {
54 SDL_ClearError();
55 CStr::from_ptr(err_ptr).to_string_lossy().into_owned()
56 }
57 }
58}