use serde::{Deserialize, Serialize};
use crate::Result;
use super::request;
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
#[serde(rename_all = "lowercase")]
pub enum UiComponent {
Panel { children: Vec<UiComponent> },
Copyable { value: String },
Divider,
Heading { value: String },
Spinner,
Text { value: String },
}
pub mod ui {
use super::UiComponent;
pub fn panel<T>(children: T) -> UiComponent
where
T: Into<Vec<UiComponent>>,
{
UiComponent::Panel {
children: children.into(),
}
}
pub fn copyable<T>(value: T) -> UiComponent
where
T: Into<String>,
{
UiComponent::Copyable {
value: value.into(),
}
}
pub fn divider() -> UiComponent {
UiComponent::Divider
}
pub fn heading<T>(value: T) -> UiComponent
where
T: Into<String>,
{
UiComponent::Heading {
value: value.into(),
}
}
pub fn spinner() -> UiComponent {
UiComponent::Spinner
}
pub fn text<T>(value: T) -> UiComponent
where
T: Into<String>,
{
UiComponent::Text {
value: value.into(),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
struct DialogParams {
#[serde(rename = "type")]
ty: &'static str,
content: UiComponent,
#[serde(skip_serializing_if = "Option::is_none")]
placeholder: Option<String>,
}
pub async fn alert(content: UiComponent) -> Result<()> {
let req = DialogParams {
ty: "alert",
content,
placeholder: None,
};
request("snap_dialog", req).await?;
Ok(())
}
pub async fn confirm(content: UiComponent) -> Result<bool> {
let req = DialogParams {
ty: "confirmation",
content,
placeholder: None,
};
Ok(request("snap_dialog", req).await?)
}
pub async fn prompt(content: UiComponent, placeholder: &str) -> Result<Option<String>> {
let req = DialogParams {
ty: "prompt",
content,
placeholder: Some(String::from(placeholder)),
};
Ok(request("snap_dialog", req).await?)
}