package_parser/pkgs/python/
pymetadata.rs1use 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}