provenant/parsers/
autotools.rs1use crate::models::PackageData;
23use crate::models::{DatasourceId, PackageType};
24use packageurl::PackageUrl;
25use std::path::Path;
26
27use super::PackageParser;
28
29pub struct AutotoolsConfigureParser;
33
34impl PackageParser for AutotoolsConfigureParser {
35 const PACKAGE_TYPE: PackageType = PackageType::Autotools;
36
37 fn is_match(path: &Path) -> bool {
38 path.file_name()
39 .and_then(|name| name.to_str())
40 .is_some_and(|name| name == "configure" || name == "configure.ac")
41 }
42
43 fn extract_packages(path: &Path) -> Vec<PackageData> {
44 let name = path
45 .parent()
46 .and_then(|p| p.file_name())
47 .and_then(|n| n.to_str())
48 .map(|s| s.to_string())
49 .or_else(|| {
50 path.file_name()
51 .is_some_and(|name| name == "configure" || name == "configure.ac")
52 .then_some("input".to_string())
53 });
54
55 let purl = name.as_deref().and_then(|name| {
56 PackageUrl::new(Self::PACKAGE_TYPE.as_str(), name)
57 .ok()
58 .map(|purl| purl.to_string())
59 });
60
61 vec![PackageData {
62 package_type: Some(Self::PACKAGE_TYPE),
63 name,
64 datasource_id: Some(DatasourceId::AutotoolsConfigure),
65 purl,
66 ..Default::default()
67 }]
68 }
69}
70
71crate::register_parser!(
72 "Autotools configure script",
73 &["**/configure", "**/configure.ac"],
74 "autotools",
75 "C",
76 Some("https://www.gnu.org/software/autoconf/"),
77);