1use zbus::interface;2use zbus::{fdo, proxy};34use crate::Source;5use crate::{BlockingPrompter, Result};6use crate::{Error, Prompter};78pub struct DbusPrompterInterface<P>(pub P);9#[interface(name = "lach.PolkitInputHandler")]10impl<P: Prompter + Send + Sync + 'static> DbusPrompterInterface<P> {11 async fn prompt_radio(12 &self,13 prompt: &str,14 description: &str,15 source: Vec<Source>,16 ) -> fdo::Result<bool> {17 Ok(self.0.prompt_radio(prompt, description, &source).await?)18 }19 async fn prompt_text(20 &self,21 echo: bool,22 prompt: &str,23 description: &str,24 source: Vec<Source>,25 ) -> fdo::Result<String> {26 Ok(self27 .028 .prompt_text(echo, prompt, description, &source)29 .await?)30 }31 async fn display_text(32 &self,33 error: bool,34 description: &str,35 source: Vec<Source>,36 ) -> fdo::Result<()> {37 Ok(self.0.display_text(error, description, &source).await?)38 }39}4041#[proxy(interface = "lach.PolkitInputHandler")]42trait DbusPrompter {43 async fn prompt_radio(44 &self,45 prompt: &str,46 description: &str,47 source: &[Source],48 ) -> fdo::Result<bool>;49 async fn prompt_text(50 &self,51 echo: bool,52 prompt: &str,53 description: &str,54 source: &[Source],55 ) -> fdo::Result<String>;56 async fn display_text(57 &self,58 error: bool,59 description: &str,60 source: &[Source],61 ) -> fdo::Result<()>;62}6364impl Prompter for DbusPrompterProxy<'_> {65 async fn prompt_radio(66 &self,67 prompt: &str,68 description: &str,69 source: &[Source],70 ) -> Result<bool> {71 Ok(self.prompt_radio(prompt, description, source).await?)72 }7374 async fn prompt_text(75 &self,76 echo: bool,77 prompt: &str,78 description: &str,79 source: &[Source],80 ) -> Result<String> {81 Ok(self.prompt_text(echo, prompt, description, source).await?)82 }8384 async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {85 Ok(self.display_text(error, description, source).await?)86 }87}88impl BlockingPrompter for DbusPrompterProxyBlocking<'_> {89 fn prompt_radio(&self, prompt: &str, description: &str, source: &[Source]) -> Result<bool> {90 Ok(self.prompt_radio(prompt, description, source)?)91 }9293 fn prompt_text(94 &self,95 echo: bool,96 prompt: &str,97 description: &str,98 source: &[Source],99 ) -> Result<String> {100 Ok(self.prompt_text(echo, prompt, description, source)?)101 }102103 fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {104 Ok(self.display_text(error, description, source)?)105 }106}107108impl From<fdo::Error> for Error {109 fn from(value: fdo::Error) -> Self {110 if matches!(value, fdo::Error::NoReply(_)) {111 return Self::Cancel;112 }113 Self::InputError(format!("{value}"))114 }115}116impl From<Error> for fdo::Error {117 fn from(value: Error) -> Self {118 match value {119 Error::Cancel => fdo::Error::NoReply("input was cancelled".to_owned()),120 Error::InputError(e) => fdo::Error::Failed(e),121 }122 }123}