oo-api 0.0.3

Api support for ∞ extensions
Documentation
use serde::Deserialize;

#[derive(Deserialize)]
pub(crate) struct ShowNotification {
    pub(crate) message: String,
    #[serde(default)]
    pub(crate) level: String,
}

#[derive(Deserialize)]
pub(crate) struct OpenFile {
    pub(crate) path: String,
}

#[derive(Deserialize)]
pub(crate) struct UpdateStatusBar {
    pub(crate) text: String,
    #[serde(default)]
    pub(crate) slot: String,
}

#[derive(Deserialize)]
pub(crate) struct CreateTerminal {
    pub(crate) command: String,
    #[serde(default = "default_terminal_title")]
    pub(crate) title: String,
}

fn default_terminal_title() -> String {
    "Terminal".to_owned()
}

#[derive(Deserialize)]
pub(crate) struct ShowPicker {
    #[serde(default)]
    pub(crate) title: String,
    #[serde(default)]
    pub(crate) items: Vec<PickerItem>,
}

#[derive(Deserialize)]
pub(crate) struct PickerItem {
    #[serde(default)]
    pub(crate) label: String,
    #[serde(default)]
    pub(crate) value: String,
}

#[derive(Deserialize)]
pub(crate) struct RunCommand {
    pub(crate) id: String,
}

// ---------------------------------------------------------------------------
// Payload enum — each variant is keyed on a single required top-level field,
// making untagged matching unambiguous.
// ---------------------------------------------------------------------------

#[derive(Deserialize)]
#[serde(untagged)]
pub(crate) enum Payload {
    ShowNotification { show_notification: ShowNotification },
    OpenFile { open_file: OpenFile },
    UpdateStatusBar { update_status_bar: UpdateStatusBar },
    CreateTerminal { create_terminal: CreateTerminal },
    ShowPicker { show_picker: ShowPicker },
    RunCommand { run_command: RunCommand },
}