git.delta.rocks / remowt / refs/commits / 2499daa8100a

difftreelog

source

crates/ui-prompt/src/dbus.rs3.4 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_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}