use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[ts(export)]
pub enum CommandSource {
Builtin,
Plugin(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, ts_rs::TS)]
#[ts(export)]
pub struct Command {
pub name: String,
pub description: String,
pub action_name: String,
pub plugin_name: String,
pub custom_contexts: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields)]
#[ts(export, rename = "PromptSuggestion")]
pub struct Suggestion {
pub text: String,
#[serde(default)]
#[ts(optional)]
pub description: Option<String>,
#[serde(default)]
#[ts(optional)]
pub value: Option<String>,
#[serde(default)]
#[ts(optional)]
pub disabled: Option<bool>,
#[serde(default)]
#[ts(optional)]
pub keybinding: Option<String>,
#[serde(skip)]
#[ts(skip)]
pub source: Option<CommandSource>,
}
#[cfg(feature = "plugins")]
impl<'js> rquickjs::FromJs<'js> for Suggestion {
fn from_js(_ctx: &rquickjs::Ctx<'js>, value: rquickjs::Value<'js>) -> rquickjs::Result<Self> {
rquickjs_serde::from_value(value).map_err(|e| rquickjs::Error::FromJs {
from: "object",
to: "Suggestion",
message: Some(e.to_string()),
})
}
}
impl Suggestion {
pub fn new(text: String) -> Self {
Self {
text,
description: None,
value: None,
disabled: None,
keybinding: None,
source: None,
}
}
pub fn is_disabled(&self) -> bool {
self.disabled.unwrap_or(false)
}
}