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_enum(44 &self,45 prompt: &str,46 description: &str,47 variants: &[&str],48 source: &[Source],49 ) -> fdo::Result<u32>;50 async fn prompt_text(51 &self,52 echo: bool,53 prompt: &str,54 description: &str,55 source: &[Source],56 ) -> fdo::Result<String>;57 async fn display_text(58 &self,59 error: bool,60 description: &str,61 source: &[Source],62 ) -> fdo::Result<()>;63}6465impl Prompter for DbusPrompterProxy<'_> {66 async fn prompt_enum(67 &self,68 prompt: &str,69 description: &str,70 variants: &[&str],71 source: &[Source],72 ) -> Result<u32> {73 Ok(self74 .prompt_enum(prompt, description, variants, source)75 .await?)76 }7778 async fn prompt_text(79 &self,80 echo: bool,81 prompt: &str,82 description: &str,83 source: &[Source],84 ) -> Result<String> {85 Ok(self.prompt_text(echo, prompt, description, source).await?)86 }8788 async fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {89 Ok(self.display_text(error, description, source).await?)90 }91}92impl BlockingPrompter for DbusPrompterProxyBlocking<'_> {93 fn prompt_enum(94 &self,95 prompt: &str,96 description: &str,97 variants: &[&str],98 source: &[Source],99 ) -> Result<u32> {100 Ok(self.prompt_enum(prompt, description, variants, source)?)101 }102103 fn prompt_text(104 &self,105 echo: bool,106 prompt: &str,107 description: &str,108 source: &[Source],109 ) -> Result<String> {110 Ok(self.prompt_text(echo, prompt, description, source)?)111 }112113 fn display_text(&self, error: bool, description: &str, source: &[Source]) -> Result<()> {114 Ok(self.display_text(error, description, source)?)115 }116}117118impl From<fdo::Error> for Error {119 fn from(value: fdo::Error) -> Self {120 if matches!(value, fdo::Error::NoReply(_)) {121 return Self::Cancel;122 }123 Self::InputError(format!("{value}"))124 }125}126impl From<Error> for fdo::Error {127 fn from(value: Error) -> Self {128 match value {129 Error::Cancel => fdo::Error::NoReply("input was cancelled".to_owned()),130 Error::InputError(e) => fdo::Error::Failed(e),131 }132 }133}