From 048dddf48789dd995d83c4bfa5c41a02ca01662e Mon Sep 17 00:00:00 2001 From: Till Wegmueller Date: Mon, 8 Dec 2025 21:41:02 +0100 Subject: [PATCH] Refactor `get_versions` response with structured `VersionsResponse` model. - Added `Operation` enum and `SupportedOperation` struct to encapsulate supported operations and versions. - Updated response generation to dynamically include the `pkg6depotd` version and supported operations. - Enhanced integration tests to validate version string format changes. --- pkg6depotd/src/http/handlers/versions.rs | 75 ++++++++++++++++++++---- pkg6depotd/tests/integration_tests.rs | 2 +- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/pkg6depotd/src/http/handlers/versions.rs b/pkg6depotd/src/http/handlers/versions.rs index 6e599ca..8d2152e 100644 --- a/pkg6depotd/src/http/handlers/versions.rs +++ b/pkg6depotd/src/http/handlers/versions.rs @@ -1,16 +1,69 @@ use axum::response::IntoResponse; +use std::fmt; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Operation { + Info, + Versions, + Catalog, + Manifest, + File, + Publisher, +} + +impl fmt::Display for Operation { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let s = match self { + Operation::Info => "info", + Operation::Versions => "versions", + Operation::Catalog => "catalog", + Operation::Manifest => "manifest", + Operation::File => "file", + Operation::Publisher => "publisher", + }; + write!(f, "{}", s) + } +} + +pub struct SupportedOperation { + pub op: Operation, + pub versions: Vec, +} + +pub struct VersionsResponse { + pub server_version: String, + pub operations: Vec, +} + +impl fmt::Display for VersionsResponse { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + writeln!(f, "pkg-server {}", self.server_version)?; + for op in &self.operations { + write!(f, "{}", op.op)?; + for v in &op.versions { + write!(f, " {}", v)?; + } + writeln!(f)?; + } + Ok(()) + } +} pub async fn get_versions() -> impl IntoResponse { - // According to pkg5 depot docs: text/plain list of supported ops and versions. - // "pkg-server \ninfo 0\n..." - let version_str = "pkg-server pkg6depotd-0.1\n\ - info 0\n\ - search 0\n\ - versions 0\n\ - catalog 0 1\n\ - manifest 0 1\n\ - file 0 1\n\ - publisher 0 1\n"; + let pkg_version = env!("CARGO_PKG_VERSION"); + let server_version = format!("pkg6depotd-{}", pkg_version); + + let response = VersionsResponse { + server_version, + operations: vec![ + SupportedOperation { op: Operation::Info, versions: vec![0] }, + SupportedOperation { op: Operation::Versions, versions: vec![0] }, + SupportedOperation { op: Operation::Catalog, versions: vec![0, 1] }, + SupportedOperation { op: Operation::Manifest, versions: vec![0, 1] }, + SupportedOperation { op: Operation::File, versions: vec![0, 1] }, + SupportedOperation { op: Operation::Publisher, versions: vec![0, 1] }, + ], + }; - version_str.to_string() + response.to_string() } diff --git a/pkg6depotd/tests/integration_tests.rs b/pkg6depotd/tests/integration_tests.rs index a1a5579..1c1ba40 100644 --- a/pkg6depotd/tests/integration_tests.rs +++ b/pkg6depotd/tests/integration_tests.rs @@ -100,7 +100,7 @@ async fn test_depot_server() { let resp = client.get(format!("{}/versions/0/", base_url)).send().await.unwrap(); assert!(resp.status().is_success()); let text = resp.text().await.unwrap(); - assert!(text.contains("pkg-server pkg6depotd-0.1")); + assert!(text.contains("pkg-server pkg6depotd-0.5.1")); assert!(text.contains("catalog 0 1")); assert!(text.contains("manifest 0 1"));