hammer_cli/
npm_process.rs1use 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}