orign 0.2.3

A globally distributed container orchestrator
Documentation
use crate::resources::v1::buffers::models::{
    V1ReplayBuffer, V1ReplayBufferRequest, V1UpdateReplayBufferRequest,
};
use nebulous::models::V1ResourceMeta;
use nebulous::models::V1ResourceMetaRequest;
use nebulous::resources::v1::containers::models::{
    V1Container, V1ContainerRequest, V1UpdateContainer,
};
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1OnlineLLMRequest {
    pub metadata: V1ResourceMetaRequest,
    pub model: String,
    pub buffer: V1BufferOptionRequest,
    pub server: V1ServerOptionRequest,
    pub chat_schema: Option<String>,
}

#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1UpdateOnlineLLMRequest {
    pub model: Option<String>,
    pub buffer: Option<V1UpdateBufferOption>,
    pub server: Option<V1UpdateServerOption>,
    pub chat_schema: Option<String>,
    pub no_delete: Option<bool>,
}

#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLMStatus {
    pub is_online: Option<bool>,
    pub endpoint: Option<String>,
    pub last_error: Option<String>,
}

#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLM {
    pub metadata: V1ResourceMeta,
    pub model: String,
    pub buffer: V1ReplayBuffer,
    pub server: V1Container,
    pub chat_schema: Option<String>,
    pub status: V1OnlineLLMStatus,
}

#[derive(Deserialize, Serialize, Clone, Default)]
pub struct V1OnlineLLMs {
    pub llms: Vec<V1OnlineLLM>,
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1BufferOption {
    Id(String),
    Buffer(V1ReplayBuffer),
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1UpdateBufferOption {
    Id(String),
    Buffer(V1UpdateReplayBufferRequest),
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1BufferOptionRequest {
    Id(String),
    Buffer(V1ReplayBufferRequest),
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1ServerOption {
    Ref(V1ResourceReference),
    Server(V1Container),
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1UpdateServerOption {
    Ref(V1ResourceReference),
    Server(V1UpdateContainer),
}

#[derive(Deserialize, Serialize, Clone, Debug)]
pub struct V1ResourceReference {
    pub kind: String,
    pub name: String,
    pub namespace: String,
}

impl V1ResourceReference {
    /// Convert a `V1ResourceReference` to a string, encoded as `name.namespace.kind`.
    pub fn to_string_encoded(&self) -> String {
        format!("{}.{}.{}", self.name, self.namespace, self.kind)
    }

    /// Parse a `V1ResourceReference` from a string in the format `name.namespace.kind`.
    pub fn from_str_encoded(encoded: &str) -> Result<Self, String> {
        let parts: Vec<&str> = encoded.split('.').collect();
        if parts.len() != 3 {
            return Err(format!(
                "Invalid reference string: expected 3 parts, got {}",
                parts.len()
            ));
        }
        Ok(Self {
            name: parts[0].to_string(),
            namespace: parts[1].to_string(),
            kind: parts[2].to_string(),
        })
    }
}

#[derive(Deserialize, Serialize, Clone, Debug)]
#[serde(untagged)]
pub enum V1ServerOptionRequest {
    Ref(V1ResourceReference),
    Server(V1ContainerRequest),
}