Skip to main content

package_parser/pkgs/
haxe.rs

1use packageurl::PackageUrl;
2use serde_json::from_reader;
3use serde_json::Value;
4
5use crate::error::SourcePkgError;
6use crate::pkgs::common::model::{Package, PackageManifest};
7
8use super::common::model::DependentPackage;
9
10use std::fs::File;
11use std::path::Path;
12
13pub struct Haxe {}
14
15impl Haxe {
16    pub fn new() -> Self {
17        Self {}
18    }
19
20    fn parse(path: impl AsRef<Path>) -> Result<Package, SourcePkgError> {
21        let mut file = File::open(path)?;
22        let root: Value = from_reader(&mut file)?;
23        let name = match &root["name"] {
24            Value::String(name) => name.into(),
25            _ => "".into(),
26        };
27        let version = match &root["version"] {
28            Value::String(version) => version.into(),
29            _ => "".into(),
30        };
31        let requirements = match &root["dependencies"] {
32            Value::Object(deps) => {
33                let mut requirements = vec![];
34                for (name, version) in deps {
35                    let version: String = match version {
36                        Value::String(s) => s.into(),
37                        _ => "".into(),
38                    };
39
40                    requirements.push(DependentPackage {
41                        purl: PackageUrl::new("haxe", name)
42                            .expect("purl arguments are invalid")
43                            .to_string(),
44                        requirement: version.clone(),
45                        is_resolved: !version.is_empty(),
46                        ..Default::default()
47                    });
48                }
49
50                requirements
51            }
52            _ => vec![],
53        };
54
55        let package = Package {
56            name,
57            version,
58            dependencies: requirements,
59            ..Default::default()
60        };
61
62        Ok(package)
63    }
64}
65
66#[async_trait::async_trait]
67impl PackageManifest for Haxe {
68    fn get_name(&self) -> String {
69        "haxe".into()
70    }
71
72    async fn recognize(&self, path: &Path) -> Result<Package, SourcePkgError> {
73        Self::parse(path)
74    }
75
76    fn file_name_patterns(&self) -> &'static [&'static str] {
77        &["haxelib.json"]
78    }
79}
80
81#[cfg(test)]
82mod tests {
83    use super::*;
84
85    #[test]
86    fn test_haxe_parse() {
87        let filepath = Path::new(concat!(
88            env!("CARGO_MANIFEST_DIR"),
89            "/testdata/haxe/deps/haxelib.json"
90        ));
91
92        let p = Haxe::parse(filepath).unwrap();
93        println!("{:?}", p);
94    }
95}