From 89a8cad693db87dff3b125b072b8a78429ae9cae Mon Sep 17 00:00:00 2001 From: naoto Date: Wed, 28 Sep 2022 22:01:22 +0200 Subject: [PATCH] Improvements for api Better error handling, focused on using in other crates --- Cargo.toml | 2 -- src/lib.rs | 44 ++++++++++++++++++++++++++------------------ src/main.rs | 12 ++++++++++-- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b92df20..a6c00c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,5 @@ edition = "2021" [profile.release] strip = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] x11 = { version = "2.20.0", features = ["xss", "xlib"] } diff --git a/src/lib.rs b/src/lib.rs index 6ea84bd..9fe573f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ mod xinterface { + use std::ffi::c_void; use x11::xlib::{XCloseDisplay, XDefaultRootWindow, XFree, XOpenDisplay}; use x11::xss::{XScreenSaverAllocInfo, XScreenSaverQueryExtension, XScreenSaverQueryInfo}; - use std::ffi::c_void; pub struct Display { display_ptr: *mut x11::xlib::Display, @@ -24,11 +24,8 @@ mod xinterface { let mut event_basep: i32 = 0; let mut error_basep: i32 = 0; unsafe { - XScreenSaverQueryExtension( - self.display_ptr, - &mut event_basep, - &mut error_basep - ) != 0 + XScreenSaverQueryExtension(self.display_ptr, &mut event_basep, &mut error_basep) + != 0 } } @@ -79,21 +76,32 @@ mod xinterface { use xinterface::Display; -pub fn get_idle_time() -> u64 { - let display = Display::open().unwrap_or_else(|_| { - println!("Cannot open display"); - std::process::exit(1); - }); +pub enum Error { + CannotOpenDisplay, + NoScreenSaverExtension, + CannotGetScreenSaverinfo, +} + +impl Error { + pub fn message(&self) -> &'static str { + match self { + Self::CannotOpenDisplay => "Cannot open display", + Self::NoScreenSaverExtension => "Screen doesn't have screen saver extension", + Self::CannotGetScreenSaverinfo => "Cannot get screen saver info", + } + } +} + +pub fn get_idle_time() -> Result { + let display = Display::open().or(Err(Error::CannotOpenDisplay))?; if !display.has_screen_saver_extesnsion() { - println!("Screen doesn't have screen saver extension"); - std::process::exit(1); + return Err(Error::NoScreenSaverExtension); } - let screen_saver_info = display.get_screen_saver_info().unwrap_or_else(|_| { - println!("Cannot get screen saver info"); - std::process::exit(1); - }); + let screen_saver_info = display + .get_screen_saver_info() + .or(Err(Error::CannotGetScreenSaverinfo))?; - screen_saver_info.idle_time() + Ok(screen_saver_info.idle_time()) } diff --git a/src/main.rs b/src/main.rs index bf19ba8..f9c6473 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,11 @@ -fn main() { - println!("{}", rs_idle::get_idle_time()); +fn error(error: rs_idle::Error) -> ! { + println!("{}", error.message()); + std::process::exit(1); +} + +fn main() { + println!( + "{}", + rs_idle::get_idle_time().unwrap_or_else(|e| { error(e) }) + ); }