Rusty error handling

This commit is contained in:
numzero 2025-11-11 01:01:21 +03:00
parent 6f687d2fc1
commit 6d8b0294d6

View File

@ -19,22 +19,20 @@ struct MainWindow {
} }
impl MainWindow { impl MainWindow {
fn new(event_loop: &ActiveEventLoop) -> Self { fn new(event_loop: &ActiveEventLoop) -> Result<Self, Box<dyn Error>> {
let handle = event_loop let handle = event_loop.create_window(Window::default_attributes().with_title(TITLE))?;
.create_window(Window::default_attributes().with_title(TITLE))
.unwrap();
let handle = Arc::new(handle); let handle = Arc::new(handle);
let (device, queue, surface) = pollster::block_on(init_gpu(Arc::clone(&handle))).unwrap(); let (device, queue, surface) = pollster::block_on(init_gpu(Arc::clone(&handle)))?;
queue.submit([]); queue.submit([]);
Self { Ok(Self {
handle, handle,
device, device,
queue, queue,
surface, surface,
surface_configured: false, surface_configured: false,
} })
} }
fn render(&self, output: &wgpu::Texture) { fn render(&self, output: &wgpu::Texture) {
@ -88,7 +86,13 @@ impl MainWindow {
if !self.surface_configured { if !self.surface_configured {
return; return;
} }
let output = self.surface.get_current_texture().unwrap(); let output = match self.surface.get_current_texture() {
Ok(texture) => texture,
Err(err) => {
eprintln!("error: can't redraw: can't get target texture: {err:#}");
return;
}
};
self.render(&output.texture); self.render(&output.texture);
output.present(); output.present();
} }
@ -109,7 +113,15 @@ impl Application {
impl ApplicationHandler for Application { impl ApplicationHandler for Application {
fn resumed(&mut self, event_loop: &ActiveEventLoop) { fn resumed(&mut self, event_loop: &ActiveEventLoop) {
self.main_window = Some(MainWindow::new(event_loop)); let main_window = match MainWindow::new(event_loop) {
Ok(window) => window,
Err(err) => {
eprintln!("error: can't resume: can't create the main window: {err:#}");
event_loop.exit();
return;
}
};
self.main_window = Some(main_window);
} }
fn window_event( fn window_event(
@ -141,18 +153,17 @@ async fn init_gpu<'window>(
compatible_surface: Some(&surface), compatible_surface: Some(&surface),
force_fallback_adapter: false, force_fallback_adapter: false,
}) })
.await .await?;
.unwrap();
let (device, queue) = adapter let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor::default()) .request_device(&wgpu::DeviceDescriptor::default())
.await .await?;
.unwrap();
Ok((device, queue, surface)) Ok((device, queue, surface))
} }
fn main() { fn main() -> Result<(), Box<dyn Error>> {
let event_loop = EventLoop::new().unwrap(); let event_loop = EventLoop::new()?;
event_loop.set_control_flow(ControlFlow::Wait); event_loop.set_control_flow(ControlFlow::Wait);
let mut app = Application::new(); let mut app = Application::new();
event_loop.run_app(&mut app).unwrap(); event_loop.run_app(&mut app)?;
Ok(())
} }