//! Plugin identity and capability declaration.

/// Host plugin API version. Bump when the host runtime surface breaks
/// compatibility.
pub const API_VERSION: u32 = 1;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ApiVersion {
    pub major: u32,
}

impl ApiVersion {
    pub const CURRENT: Self = Self { major: API_VERSION };

    pub fn is_compatible_with(host: ApiVersion) -> bool {
        Self::CURRENT.major == host.major
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn current_matches_const() {
        assert_eq!(ApiVersion::CURRENT.major, API_VERSION);
    }

    #[test]
    fn same_major_is_compatible() {
        assert!(ApiVersion::is_compatible_with(ApiVersion::CURRENT));
        assert!(!ApiVersion::is_compatible_with(ApiVersion {
            major: API_VERSION + 1,
        }));
    }
}

/// Static metadata every plugin supplies at registration time.
/// Keep fields in sync with `plugin.toml` beside the package.
#[derive(Clone, Copy, Debug)]
pub struct PluginManifest {
    pub id: &'static str,
    pub name: &'static str,
    pub version: &'static str,
    pub description: &'static str,
    pub api_version: ApiVersion,
    /// Sort key for add-on ribbon tabs (lower = further left among plugins).
    pub ribbon_order: i32,
    pub xdata_apps: &'static [&'static str],
    pub command_prefixes: &'static [&'static str],
}
