morph_cli/core/detection/
package_json.rs1use std::collections::HashMap;
2use std::path::Path;
3
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Default, Serialize, Deserialize)]
8pub struct PackageJson {
9 #[serde(default)]
10 pub name: String,
11 #[serde(default)]
12 pub version: String,
13 #[serde(default)]
14 pub dependencies: HashMap<String, String>,
15 #[serde(rename = "devDependencies", default)]
16 pub dev_dependencies: HashMap<String, String>,
17 #[serde(default)]
18 pub scripts: HashMap<String, String>,
19 #[serde(default)]
20 pub typ: Option<String>,
21 #[serde(default)]
22 pub workspaces: Option<Value>,
23}
24
25impl PackageJson {
26 pub fn load(path: &Path) -> Option<Self> {
27 let content = std::fs::read_to_string(path).ok()?;
28 serde_json::from_str::<PackageJson>(&content).ok()
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn test_parse_basic() {
38 let json = r#"{"name":"test","version":"1.0.0"}"#;
39 let pkg: PackageJson = serde_json::from_str(json).unwrap();
40 assert_eq!(pkg.name, "test");
41 assert_eq!(pkg.version, "1.0.0");
42 }
43
44 #[test]
45 fn test_parse_deps() {
46 let json = r#"{"name":"test","dependencies":{"express":"^4.0"}}"#;
47 let pkg: PackageJson = serde_json::from_str(json).unwrap();
48 assert_eq!(pkg.dependencies.get("express").unwrap(), "^4.0");
49 }
50}