use serde::Serialize;
use zerolaunch_plugin_api::plugin::{PluginKind, PluginMetadata, PluginMode};
use crate::manager::PluginRuntimeState;
#[derive(Debug, Clone, Serialize)]
pub struct PluginInfo {
#[serde(rename = "pluginId")]
pub plugin_id: String,
#[serde(rename = "name")]
pub name: String,
#[serde(rename = "version")]
pub version: String,
#[serde(rename = "description")]
pub description: String,
#[serde(rename = "author")]
pub author: String,
#[serde(rename = "state")]
pub state: PluginRuntimeState,
#[serde(rename = "enabled")]
pub enabled: bool,
#[serde(rename = "kind", default)]
pub kind: PluginKind,
#[serde(rename = "priority")]
pub priority: u32,
#[serde(rename = "canUninstall")]
pub can_uninstall: bool,
#[serde(rename = "canReload")]
pub can_reload: bool,
#[serde(rename = "canViewLogs")]
pub can_view_logs: bool,
#[serde(rename = "canToggle")]
pub can_toggle: bool,
#[serde(rename = "hotkey", default)]
pub hotkey: Option<String>,
#[serde(rename = "icon", default)]
pub icon: Option<String>,
#[serde(rename = "mode", default)]
pub mode: PluginMode,
}
impl PluginInfo {
pub fn from_metadata(meta: &PluginMetadata, state: PluginRuntimeState, enabled: bool) -> Self {
let third_party = meta.kind == PluginKind::ThirdParty;
let can_toggle = !(third_party && matches!(state, PluginRuntimeState::Error));
Self {
plugin_id: meta.id.clone(),
name: meta.name.clone(),
version: meta.version.clone(),
description: meta.description.clone(),
author: meta.author.clone(),
state,
enabled,
kind: meta.kind,
priority: meta.priority,
can_uninstall: third_party,
can_reload: third_party,
can_view_logs: third_party,
can_toggle,
hotkey: meta.hotkey.clone(),
icon: meta.icon.clone(),
mode: meta.mode,
}
}
}