Skip to main content

package_json_parser/def/
dev_dependencies.rs

1use derive_more::{Deref, DerefMut};
2use jsonc_parser::ast::ObjectProp;
3use rustc_hash::FxHashMap;
4use serde::de::{MapAccess, Visitor, value::MapAccessDeserializer};
5use serde::{Deserialize, Deserializer, Serialize};
6use std::fmt;
7
8use crate::ext::Validator;
9
10#[derive(Debug, Serialize, Clone, Deref, DerefMut, Default)]
11pub struct DevDependencies(FxHashMap<String, String>);
12
13impl<'de> Deserialize<'de> for DevDependencies {
14  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
15  where
16    D: Deserializer<'de>,
17  {
18    struct DevDependenciesVisitor;
19
20    impl<'de> Visitor<'de> for DevDependenciesVisitor {
21      type Value = DevDependencies;
22
23      fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
24        formatter.write_str("an object map for devDependencies")
25      }
26
27      fn visit_map<M>(self, map: M) -> Result<Self::Value, M::Error>
28      where
29        M: MapAccess<'de>,
30      {
31        let value = FxHashMap::<String, String>::deserialize(MapAccessDeserializer::new(map))?;
32        Ok(DevDependencies(value))
33      }
34    }
35
36    deserializer.deserialize_any(DevDependenciesVisitor)
37  }
38}
39
40impl Validator for DevDependencies {
41  fn validate(&self, _prop: Option<&ObjectProp>) -> miette::Result<()> {
42    Ok(())
43  }
44}
45
46#[cfg(test)]
47mod tests {
48  use crate::PackageJsonParser;
49
50  #[test]
51  fn should_deserialize_dev_dependencies_successfully() {
52    let parsed = PackageJsonParser::parse_str(r#"{"devDependencies":{"foo":"^1.0.0"}}"#);
53    assert!(parsed.is_ok());
54  }
55
56  #[test]
57  fn should_fail_deserialize_dev_dependencies_when_type_is_invalid() {
58    let parsed = PackageJsonParser::parse_str(r#"{"devDependencies":"foo"}"#);
59    assert!(parsed.is_ok());
60    let parsed = parsed.unwrap();
61    assert!(parsed.dev_dependencies().is_err());
62  }
63
64  #[test]
65  fn should_fail_deserialize_dev_dependencies_when_json_is_invalid() {
66    let parsed = PackageJsonParser::parse_str("{");
67    assert!(parsed.is_err());
68  }
69}