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}