use serde::{Deserialize, Serialize};
use crate::bridge::ids::Sha256Digest;
pub const OPENCODE_V2_MIN_BRIDGE: semver::Version = semver::Version::new(0, 73, 0);
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(from = "ManifestOpenCodeWire")]
pub struct ManifestOpenCode {
#[serde(skip_serializing_if = "Option::is_none")]
pub min_client_version: Option<semver::Version>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub themes: Vec<ThemeRef>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_theme: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub theme_mode: Option<ThemeMode>,
#[serde(skip_serializing_if = "serde_json::Map::is_empty")]
pub cli_defaults: serde_json::Map<String, serde_json::Value>,
}
impl ManifestOpenCode {
#[must_use]
pub fn default_theme_ref(&self) -> Option<&ThemeRef> {
let name = self.default_theme.as_deref()?;
self.themes.iter().find(|t| t.name == name)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ThemeRef {
pub name: String,
pub sha: Sha256Digest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ThemeMode {
System,
Dark,
Light,
}
#[derive(Deserialize)]
struct ManifestOpenCodeWire {
#[serde(default)]
min_client_version: Option<semver::Version>,
#[serde(default)]
themes: Vec<ThemeRef>,
#[serde(default)]
theme: Option<ThemeRef>,
#[serde(default)]
default_theme: Option<String>,
#[serde(default)]
theme_mode: Option<ThemeMode>,
#[serde(default)]
cli_defaults: serde_json::Map<String, serde_json::Value>,
}
impl From<ManifestOpenCodeWire> for ManifestOpenCode {
fn from(wire: ManifestOpenCodeWire) -> Self {
let mut themes = wire.themes;
let mut default_theme = wire.default_theme;
if let Some(single) = wire.theme {
default_theme.get_or_insert_with(|| single.name.clone());
if !themes.iter().any(|t| t.name == single.name) {
themes.push(single);
}
}
Self {
min_client_version: wire.min_client_version,
themes,
default_theme,
theme_mode: wire.theme_mode,
cli_defaults: wire.cli_defaults,
}
}
}