1mod detect;
2mod download;
3mod execute;
4mod install;
5mod resolve;
6mod shim;
7mod verify;
8
9use once_cell::sync::OnceCell;
10use proto_core::{impl_tool, Describable, Manifest, Proto, ProtoError, Tool};
11use std::{
13 any::Any,
14 path::{Path, PathBuf},
15};
16
17#[derive(Debug)]
18pub enum NodeDependencyManagerType {
19 Npm,
20 Pnpm,
21 Yarn,
22}
23
24impl NodeDependencyManagerType {
25 pub fn get_package_name(&self) -> String {
26 match self {
27 NodeDependencyManagerType::Npm => "npm".into(),
28 NodeDependencyManagerType::Pnpm => "pnpm".into(),
29 NodeDependencyManagerType::Yarn => "yarn".into(),
30 }
31 }
32}
33
34#[derive(Debug)]
35pub struct NodeDependencyManager {
36 pub base_dir: PathBuf,
37 pub bin_path: Option<PathBuf>,
38 pub package_name: String,
40 pub shim_path: Option<PathBuf>,
41 pub temp_dir: PathBuf,
42 pub type_of: NodeDependencyManagerType,
43 pub version: Option<String>,
44
45 manifest: OnceCell<Manifest>,
46}
47
48impl NodeDependencyManager {
49 pub fn new<P: AsRef<Proto>>(proto: P, type_of: NodeDependencyManagerType) -> Self {
50 let proto = proto.as_ref();
51 let package_name = type_of.get_package_name();
52
53 NodeDependencyManager {
54 base_dir: proto.tools_dir.join(&package_name),
55 bin_path: None,
56 manifest: OnceCell::new(),
58 shim_path: None,
59 temp_dir: proto.temp_dir.join(&package_name),
60 type_of,
61 version: None,
62 package_name,
63 }
64 }
65
66 }
72
73impl Describable<'_> for NodeDependencyManager {
74 fn get_id(&self) -> &str {
75 &self.package_name
76 }
77
78 fn get_name(&self) -> String {
79 self.type_of.get_package_name()
80 }
81}
82
83impl_tool!(NodeDependencyManager);