use url::Url;
use zbus::{Connection, Result};
#[derive(Debug, Clone)]
pub struct FreedesktopPortalProxyResolver {
connection: zbus::Connection,
}
static_assertions::assert_impl_all!(FreedesktopPortalProxyResolver: Send, Sync);
impl<'a> FreedesktopPortalProxyResolver {
pub fn new(connection: Connection) -> Self {
Self { connection }
}
pub async fn connect() -> Result<Self> {
Ok(Self::new(zbus::Connection::session().await?))
}
pub async fn lookup(&self, url: &Url) -> Result<Option<Url>> {
let proxies: Vec<String> = self
.connection
.call_method(
Some("org.freedesktop.portal.Desktop"),
"/org/freedesktop/portal/desktop",
Some("org.freedesktop.portal.ProxyResolver"),
"Lookup",
&(url.as_str(),),
)
.await?
.body()?;
match proxies.get(0) {
None => Ok(None),
Some(url) if url == "direct://" => Ok(None),
Some(url) => Url::parse(url).map(Some).map_err(|parse_error| {
zbus::Error::Failure(format!("Failed to parse proxy URL {url}: {parse_error}",))
}),
}
}
}