mirror of
https://codeberg.org/Toasterson/ips.git
synced 2026-04-10 13:20:42 +00:00
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:
parent
0b3a974ca6
commit
048dddf487
2 changed files with 65 additions and 12 deletions
|
|
@ -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<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 {
|
||||
// According to pkg5 depot docs: text/plain list of supported ops and versions.
|
||||
// "pkg-server <version>\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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue