use crate::plugin::{ArchiveTypePlugin, ExtensionRow, Claim, HandlerSpec};
pub struct GenericPlugin;
impl GenericPlugin {
pub fn new() -> Self {
Self
}
}
impl Default for GenericPlugin {
fn default() -> Self {
Self::new()
}
}
pub static GENERIC_SPEC: HandlerSpec = HandlerSpec {
name: "generic",
aliases: &["none", "raw", "plain", "blob"],
type_id: 26,
ecosystem: "none — an arbitrary file tree",
extensions: &[],
claim: Claim::Extensions,
description: "Any directory tree as opaque blobs — no metadata extracted, \
no package type claimed. The honest choice for a \
container-registry mirror, a build output or a data dump.",
fields: &[],
commands: &[],
};
impl ArchiveTypePlugin for GenericPlugin {
fn spec(&self) -> &HandlerSpec {
&GENERIC_SPEC
}
fn extract_metadata(&self, _path: &str, _data: &[u8]) -> Option<ExtensionRow> {
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn nothing_is_claimed_and_nothing_is_extracted() {
let p = GenericPlugin::new();
for path in [
"blob/9f2c1e0b7a4d3f8c6e5a2b9d0c7f4e1a8b3d6c9e2f0a1b2c3d4e5f6a7b8c9d0e",
"manifests/registry.k8s.io:5000/kube-apiserver/reference/v1.30.0+build1",
"manifests/ghcr.io/siderolabs@sha256/digest/sha256:abcdef",
"manifests/ünïcödé-täg.json",
"serde-1.0.200.crate",
"guava-33.0.jar",
] {
assert!(!p.matches_path(path), "generic must claim nothing: {path}");
assert!(p.extract_metadata(path, b"whatever").is_none());
}
assert!(p.schema_fields().is_empty(), "no columns means no schema change");
assert!(p.meta().extensions.is_empty(), "claiming an extension is the promise we avoid");
}
#[test]
fn the_no_package_aliases_are_declared() {
let m = GenericPlugin::new().meta();
for want in ["none", "raw", "plain", "blob"] {
assert!(m.aliases.iter().any(|a| a == want), "missing alias {want}");
}
assert!(m.aliases.iter().all(|a| a.chars().all(|c| c.is_ascii_lowercase())));
assert_eq!(m.name, "generic");
assert_eq!(m.type_id, 26);
}
}