pub trait PackageParser {
const PACKAGE_TYPE: PackageType;
// Required methods
fn extract_packages(path: &Path) -> Vec<PackageData>;
fn is_match(path: &Path) -> bool;
// Provided method
fn extract_first_package(path: &Path) -> PackageData { ... }
}Expand description
Package parser trait for extracting metadata from package manifest files.
Each parser implementation handles a specific package manager/ecosystem
(npm, Maven, Python, Cargo, etc.) and extracts standardized metadata into
PackageData structures compatible with ScanCode Toolkit JSON output format.
§Implementation Guide
Implementors must provide:
PACKAGE_TYPE: Package URL (purl) type identifier (e.g., “npm”, “pypi”, “maven”)is_match(): Returns true if the given file path matches this parser’s expected formatextract_packages(): Parses the file and returns all extracted package metadata
§Error Handling
Parsers should handle errors gracefully by returning default/empty PackageData
and logging warnings rather than panicking. This allows the scan to continue
processing other files even when individual files fail to parse.
§Example
use provenant::models::{PackageData, PackageType};
use provenant::parsers::PackageParser;
use std::path::Path;
pub struct MyParser;
impl PackageParser for MyParser {
const PACKAGE_TYPE: PackageType = PackageType::Npm;
fn is_match(path: &Path) -> bool {
path.file_name().is_some_and(|name| name == "package.json")
}
fn extract_packages(path: &Path) -> Vec<PackageData> {
// Parse file and return metadata
// On error, log warning and return default
vec![PackageData::default()]
}
}Required Associated Constants§
Sourceconst PACKAGE_TYPE: PackageType
const PACKAGE_TYPE: PackageType
Package URL type identifier for this parser (e.g., PackageType::Npm, PackageType::Pypi).
Required Methods§
Sourcefn extract_packages(path: &Path) -> Vec<PackageData>
fn extract_packages(path: &Path) -> Vec<PackageData>
Extracts all packages from the given file path.
Returns a vector of PackageData structures containing all extracted metadata
including name, version, dependencies, licenses, etc. Most parsers return a
single-element vector, but some (e.g., Bazel BUILD, Buck BUCK, Debian control)
can contain multiple packages in a single file.
On parse errors, returns a vector with a default PackageData with minimal or
no fields populated.
Provided Methods§
Sourcefn extract_first_package(path: &Path) -> PackageData
fn extract_first_package(path: &Path) -> PackageData
Returns the first package from extract_packages(),
or a default PackageData if the file contains no packages.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.