Skip to main content

package_parser/pkgs/python/
pymetadata.rs

1use python_pkginfo::Metadata;
2
3use crate::error::SourcePkgError;
4use crate::pkgs::common::model::{Package, PackageManifest};
5
6use std::fs::File;
7use std::io::Read;
8use std::path::Path;
9
10pub struct PyMetadata {}
11
12impl PyMetadata {
13    pub fn new() -> Self {
14        PyMetadata {}
15    }
16
17    fn parse(path: impl AsRef<Path>) -> Result<Package, SourcePkgError> {
18        let mut fs = File::open(path)?;
19        let mut content = Vec::new();
20        fs.read_to_end(&mut content)?;
21        let metadata = Metadata::parse(content.as_slice())?;
22        let package = Package {
23            name: metadata.name,
24            version: metadata.version,
25            primary_language: "Python".into(),
26            declared_license: metadata.license.unwrap_or_default(),
27            ..Default::default()
28        };
29
30        Ok(package)
31    }
32}
33
34#[async_trait::async_trait]
35impl PackageManifest for PyMetadata {
36    fn get_name(&self) -> String {
37        "pypi".to_string()
38    }
39
40    async fn recognize(&self, path: &Path) -> Result<Package, SourcePkgError> {
41        Self::parse(path)
42    }
43
44    fn file_name_patterns(&self) -> &'static [&'static str] {
45        &["PKG-INFO", "METADATA"]
46    }
47}