agent-deploy-contract 0.3.1

Transport-neutral deploy contracts for Agent Infra
Documentation
use serde::{Deserialize, Serialize};

use crate::CursorPage;

pub const RUNTIME_TEMPLATE_GIT_REF: &str = "master";

pub type RuntimeTemplatePage = CursorPage<RuntimeTemplate>;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RuntimeTemplate {
    pub id: String,
    pub name: String,
    pub repository_url: String,
    pub git_ref: String,
    pub subdirectory: Option<String>,
    pub description: Option<String>,
    pub enabled: bool,
    pub version: i64,
    pub created_at: String,
    pub updated_at: String,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CreateRuntimeTemplateRequest {
    pub name: String,
    pub repository_url: String,
    #[serde(default = "default_git_ref")]
    pub git_ref: String,
    pub subdirectory: Option<String>,
    pub description: Option<String>,
    #[serde(default = "enabled_by_default")]
    pub enabled: bool,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct UpdateRuntimeTemplateRequest {
    pub name: String,
    pub repository_url: String,
    #[serde(default = "default_git_ref")]
    pub git_ref: String,
    pub subdirectory: Option<String>,
    pub description: Option<String>,
    pub enabled: bool,
    pub expected_version: i64,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct DeleteRuntimeTemplateRequest {
    pub expected_version: i64,
}

#[derive(Debug, Default, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum GitLabVisibility {
    #[default]
    Private,
    Internal,
    Public,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct InitializeRuntimeTemplateRequest {
    #[serde(default)]
    pub namespace: String,
    pub project_name: String,
    pub project_path: Option<String>,
    pub description: Option<String>,
    #[serde(default)]
    pub visibility: GitLabVisibility,
}

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct RuntimeRepository {
    pub project_id: u64,
    pub path_with_namespace: String,
    pub repository_url: String,
    pub default_branch: Option<String>,
    #[serde(default)]
    pub status: crate::RuntimeRepositoryStatus,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub error_message: Option<String>,
}

fn default_git_ref() -> String {
    RUNTIME_TEMPLATE_GIT_REF.to_string()
}

const fn enabled_by_default() -> bool {
    true
}

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

    #[test]
    fn create_template_defaults_git_ref_to_master() {
        let request: CreateRuntimeTemplateRequest = serde_json::from_value(serde_json::json!({
            "name": "rust-runtime",
            "repositoryUrl": "https://git.test/templates/rust.git"
        }))
        .unwrap();
        assert_eq!(request.git_ref, "master");
        assert!(request.enabled);
    }

    #[test]
    fn update_template_defaults_git_ref_to_master() {
        let request: UpdateRuntimeTemplateRequest = serde_json::from_value(serde_json::json!({
            "name": "rust-runtime",
            "repositoryUrl": "https://git.test/templates/rust.git",
            "enabled": true,
            "expectedVersion": 1
        }))
        .unwrap();
        assert_eq!(request.git_ref, "master");
    }
}