use std::borrow::Cow;
use std::io::Write as _;
use anyhow::Context as _;
use remowt_ui_prompt::bifrost::PromptEndpointsClient;
use remowt_ui_prompt::dbus::{DbusPrompterInterface, DbusPrompterProxy};
use remowt_ui_prompt::Source;
use zbus::Connection;
use remowt_link_shared::BifConfig;
const BUS_NAME: &str = "lach.RemowtAskpass";
const PROMPTER_PATH: &str = "/lach/Askpass";
pub async fn serve(
conn: &Connection,
prompter: PromptEndpointsClient<BifConfig>,
) -> anyhow::Result<()> {
conn.object_server()
.at(PROMPTER_PATH, DbusPrompterInterface(prompter))
.await?;
conn.request_name(BUS_NAME).await?;
Ok(())
}
pub async fn ask(prompt: &str, description: String) -> anyhow::Result<()> {
let conn = Connection::session()
.await
.context("connecting to the session bus (DBUS_SESSION_BUS_ADDRESS)")?;
let proxy = DbusPrompterProxy::builder(&conn)
.destination(BUS_NAME)?
.path(PROMPTER_PATH)?
.build()
.await?;
let password = proxy
.prompt_text(
false,
prompt,
&description,
&[Source(Cow::Borrowed("remowt-askpass"))],
)
.await?;
let mut out = std::io::stdout().lock();
out.write_all(password.as_bytes())?;
out.write_all(b"\n")?;
out.flush()?;
Ok(())
}