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.
This commit is contained in:
Till Wegmueller 2025-12-08 21:41:02 +01:00
parent 0b3a974ca6
commit 048dddf487
No known key found for this signature in database
2 changed files with 65 additions and 12 deletions

View file

@ -1,16 +1,69 @@
use axum::response::IntoResponse; 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<u32>,
}
pub struct VersionsResponse {
pub server_version: String,
pub operations: Vec<SupportedOperation>,
}
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 { pub async fn get_versions() -> impl IntoResponse {
// According to pkg5 depot docs: text/plain list of supported ops and versions. let pkg_version = env!("CARGO_PKG_VERSION");
// "pkg-server <version>\ninfo 0\n..." let server_version = format!("pkg6depotd-{}", pkg_version);
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";
version_str.to_string() 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] },
],
};
response.to_string()
} }

View file

@ -100,7 +100,7 @@ async fn test_depot_server() {
let resp = client.get(format!("{}/versions/0/", base_url)).send().await.unwrap(); let resp = client.get(format!("{}/versions/0/", base_url)).send().await.unwrap();
assert!(resp.status().is_success()); assert!(resp.status().is_success());
let text = resp.text().await.unwrap(); 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("catalog 0 1"));
assert!(text.contains("manifest 0 1")); assert!(text.contains("manifest 0 1"));