Skip to main content

tinygame_core/core/
utils.rs

1use 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}