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