use std::sync::OnceLock;
use serde::{Deserialize, Serialize};
use super::command::Namespace;
#[derive(Debug, Deserialize)]
struct ProductRegistryDocument {
entries: Vec<ProductRegistryEntry>,
}
#[derive(Debug, Deserialize)]
struct ProductRegistryEntry {
namespace: String,
runtime_binary: String,
control_binary: String,
runtime_package: String,
control_package: String,
repository: String,
status: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct KnownBijuxTool {
pub namespace: &'static str,
pub runtime_binary_name: &'static str,
pub control_binary_name: &'static str,
pub runtime_package_name: &'static str,
pub control_package_name: &'static str,
pub repository_name: &'static str,
pub status: &'static str,
}
impl KnownBijuxTool {
#[must_use]
pub fn runtime_binary(&self) -> String {
self.runtime_binary_name.to_string()
}
#[must_use]
pub fn control_binary(&self) -> String {
self.control_binary_name.to_string()
}
#[must_use]
pub fn runtime_package(&self) -> String {
self.runtime_package_name.to_string()
}
#[must_use]
pub fn control_package(&self) -> String {
self.control_package_name.to_string()
}
#[must_use]
pub fn repository(&self) -> String {
self.repository_name.to_string()
}
}
fn leak(raw: String) -> &'static str {
Box::leak(raw.into_boxed_str())
}
fn load_known_bijux_tools() -> Vec<KnownBijuxTool> {
let raw = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/contracts/official_product_namespace_registry.json"
));
let document: ProductRegistryDocument =
serde_json::from_str(raw).expect("official product registry must stay valid JSON");
document
.entries
.into_iter()
.map(|entry| KnownBijuxTool {
namespace: leak(entry.namespace),
runtime_binary_name: leak(entry.runtime_binary),
control_binary_name: leak(entry.control_binary),
runtime_package_name: leak(entry.runtime_package),
control_package_name: leak(entry.control_package),
repository_name: leak(entry.repository),
status: leak(entry.status),
})
.collect()
}
fn known_bijux_tools_storage() -> &'static Vec<KnownBijuxTool> {
static STORAGE: OnceLock<Vec<KnownBijuxTool>> = OnceLock::new();
STORAGE.get_or_init(load_known_bijux_tools)
}
#[must_use]
pub fn known_bijux_tools() -> &'static [KnownBijuxTool] {
known_bijux_tools_storage().as_slice()
}
fn load_known_bijux_tool_namespaces() -> Vec<&'static str> {
known_bijux_tools().iter().map(|tool| tool.namespace).collect()
}
#[must_use]
pub fn known_bijux_tool_namespaces() -> &'static [&'static str] {
static STORAGE: OnceLock<Vec<&'static str>> = OnceLock::new();
STORAGE.get_or_init(load_known_bijux_tool_namespaces).as_slice()
}
#[must_use]
pub fn official_product_namespaces() -> &'static [&'static str] {
known_bijux_tool_namespaces()
}
#[must_use]
pub fn known_bijux_tool(namespace: &str) -> Option<&'static KnownBijuxTool> {
known_bijux_tools().iter().find(|tool| tool.namespace == namespace)
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProductMountMetadata {
pub namespace: Namespace,
pub runtime_binary: String,
pub control_binary: String,
}