git.delta.rocks / remowt / refs/commits / 7c2fb57d5b71

difftreelog

source

crates/ui-prompt/src/dbus.rs3.2 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);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}