use crate::plugin::{ArchiveTypePlugin, ExtensionRow, HandlerMeta};
pub struct GenericPlugin;
impl GenericPlugin {
pub fn new() -> Self {
Self
}
}
impl Default for GenericPlugin {
fn default() -> Self {
Self::new()
}
}
impl ArchiveTypePlugin for GenericPlugin {
fn name(&self) -> &str {
"generic"
}
fn type_id(&self) -> i8 {
26
}
fn meta(&self) -> HandlerMeta {
HandlerMeta {
name: "generic".into(),
aliases: vec!["none".into(), "raw".into(), "plain".into(), "blob".into()],
type_id: 26,
ecosystem: "none — an arbitrary file tree".into(),
extensions: Vec::new(),
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."
.into(),
commands: Vec::new(),
}
}
fn matches_path(&self, _path: &str) -> bool {
false
}
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);
}
}