git.delta.rocks / remowt / refs/commits / 42e2f16609cb

difftreelog

source

crates/ui-prompt/src/dbus.rs3.0 KiBsourcehistory
1use zbus::interface;2use zbus::{fdo, proxy};34use crate::Source;5use crate::{BlockingPrompter, Result};6use crate::{Error, Prompter};78pub struct DbusPrompterInterface<P>(pub P);910#[interface(name = "lach.PolkitInputHandler")]11impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {12	async fn prompt_radio(13		&self,14		prompt: &str,15		description: &str,16		source: Vec<Source>,17	) -> fdo::Result<bool> {18		Ok(self.0.prompt_radio(prompt, description, &source).await?)19	}20	async fn prompt_text(21		&self,22		echo: bool,23		prompt: &str,24		description: &str,25		source: Vec<Source>,26	) -> fdo::Result<String> {27		Ok(self28			.029			.prompt_text(echo, prompt, description, &source)30			.await?)31	}32	async fn display_text(33		&self,34		error: bool,35		description: &str,36		source: Vec<Source>,37	) -> fdo::Result<()> {38		Ok(self.0.display_text(error, description, &source).await?)39	}40}4142#[proxy(interface = "lach.PolkitInputHandler")]43pub trait DbusPrompter {44	async fn prompt_enum(45		&self,46		prompt: &str,47		description: &str,48		variants: &[&str],49		source: &[Source],50	) -> fdo::Result<u32>;51	async fn prompt_text(52		&self,53		echo: bool,54		prompt: &str,55		description: &str,56		source: &[Source],57	) -> fdo::Result<String>;58	async fn display_text(59		&self,60		error: bool,61		description: &str,62		source: &[Source],63	) -> fdo::Result<()>;64}6566impl Prompter for DbusPrompterProxy<'_> {67	async fn prompt_enum(68		&self,69		prompt: &str,70		description: &str,71		variants: &[&str],72		source: &[Source],73	) -> Result<u32> {74		Ok(self75			.prompt_enum(prompt, description, variants, source)76			.await?)77	}7879	async fn prompt_text(80		&self,81		echo: bool,82		prompt: &str,83		description: &str,84		source: &[Source],85	) -> Result<String> {86		Ok(self.prompt_text(echo, prompt, description, source).await?)87	}8889	async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {90		Ok(self.display_text(error, description, source).await?)91	}92}93impl BlockingPrompter for DbusPrompterProxyBlocking<'_> {94	fn prompt_enum(95		&self,96		prompt: &str,97		description: &str,98		variants: &[&str],99		source: &[Source],100	) -> Result<u32> {101		Ok(self.prompt_enum(prompt, description, variants, source)?)102	}103104	fn prompt_text(105		&self,106		echo: bool,107		prompt: &str,108		description: &str,109		source: &[Source],110	) -> Result<String> {111		Ok(self.prompt_text(echo, prompt, description, source)?)112	}113114	fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {115		Ok(self.display_text(error, description, source)?)116	}117}118119impl From<fdo::Error> for Error {120	fn from(value: fdo::Error) -> Self {121		if matches!(value, fdo::Error::NoReply(_)) {122			return Self::Cancel;123		}124		Self::InputError(format!("{value}"))125	}126}127impl From<Error> for fdo::Error {128	fn from(value: Error) -> Self {129		match value {130			Error::Cancel => fdo::Error::NoReply("input was cancelled".to_owned()),131			Error::Remote(e) => fdo::Error::NoReply(format!("remote error occured: {e}")),132			Error::InputError(e) => fdo::Error::Failed(e),133		}134	}135}