hammer_cli/
npm_process.rs

1use serde_json::Value;
2use crate::args::Args;
3use crate::errors::{BeautifulErrors,panic_err};
4
5use crate::package_json::get_package_json;
6
7pub struct NpmProcessContext {
8    pub name: String,
9    pub dir: String,
10    pub package_json_path: String,
11    pub args: Args,
12    pub package_json: Value,
13}
14
15impl NpmProcessContext {
16    pub fn new(dir_entry: walkdir::DirEntry, args: Args) -> Self {
17        let entry_path = dir_entry.path().to_str().expect_or_err(
18            &format!("Error converting directory path to string: {}", dir_entry.path().display())
19        );
20        let dir = str::replace(entry_path, "package.json", "");
21        let package_json = get_package_json(entry_path);
22        let package_json_path = String::from(format!("{}package.json", dir));
23        let name = package_json.get("name").expect_or_err(
24            &format!("Could not find project name at file {}", package_json_path)
25        );
26        let name = match name {
27            serde_json::Value::String(name) => name.clone(),
28            _ => panic_err(&format!("Project name at file {} was not a string", package_json_path))
29        };
30
31        Self {
32            name,
33            dir,
34            package_json_path,
35            args,
36            package_json,
37        }
38    }
39
40    pub fn validate_script(self) -> Option<Self> {
41        let scripts = self.package_json.get("scripts");
42        let script_name = format!("{}{}", {
43            if self.args.no_prefix { "" } else { "hammer:" }
44        }, self.args.script);
45
46        if let Some(scripts) = scripts {
47            let choosen_script = scripts.get(script_name.clone());
48            if let Some(_) = choosen_script {
49                return Some(Self {
50                    args: Args {
51                        script: script_name,
52                        ..self.args
53                    },
54                    ..self
55                });
56            }
57            return None;
58        }
59        return None;
60    }
61}