use std::collections::HashMap;
use std::path::Path;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct PackageJson {
#[serde(default)]
pub name: String,
#[serde(default)]
pub version: String,
#[serde(default)]
pub dependencies: HashMap<String, String>,
#[serde(rename = "devDependencies", default)]
pub dev_dependencies: HashMap<String, String>,
#[serde(default)]
pub scripts: HashMap<String, String>,
#[serde(default)]
pub typ: Option<String>,
#[serde(default)]
pub workspaces: Option<Value>,
}
impl PackageJson {
pub fn load(path: &Path) -> Option<Self> {
let content = std::fs::read_to_string(path).ok()?;
serde_json::from_str::<PackageJson>(&content).ok()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_basic() {
let json = r#"{"name":"test","version":"1.0.0"}"#;
let pkg: PackageJson = serde_json::from_str(json).unwrap();
assert_eq!(pkg.name, "test");
assert_eq!(pkg.version, "1.0.0");
}
#[test]
fn test_parse_deps() {
let json = r#"{"name":"test","dependencies":{"express":"^4.0"}}"#;
let pkg: PackageJson = serde_json::from_str(json).unwrap();
assert_eq!(pkg.dependencies.get("express").unwrap(), "^4.0");
}
}