1use std::{fmt::Display, str::FromStr};
6
7use crate::{template::Template, utils::colors::*};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10#[non_exhaustive]
11#[derive(Default)]
12pub enum PackageManager {
13 #[default]
14 Cargo,
15 Pnpm,
16 Yarn,
17 Npm,
18 Deno,
19 Bun,
20 Dotnet,
21}
22
23impl Display for PackageManager {
24 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25 match self {
26 PackageManager::Cargo => write!(f, "cargo"),
27 PackageManager::Pnpm => write!(f, "pnpm"),
28 PackageManager::Yarn => write!(f, "yarn"),
29 PackageManager::Npm => write!(f, "npm"),
30 PackageManager::Deno => write!(f, "deno"),
31 PackageManager::Bun => write!(f, "bun"),
32 PackageManager::Dotnet => write!(f, "dotnet"),
33 }
34 }
35}
36
37impl FromStr for PackageManager {
38 type Err = String;
39 fn from_str(s: &str) -> Result<Self, Self::Err> {
40 match s {
41 "cargo" => Ok(PackageManager::Cargo),
42 "pnpm" => Ok(PackageManager::Pnpm),
43 "yarn" => Ok(PackageManager::Yarn),
44 "npm" => Ok(PackageManager::Npm),
45 "deno" => Ok(PackageManager::Deno),
46 "bun" => Ok(PackageManager::Bun),
47 "dotnet" => Ok(PackageManager::Dotnet),
48 _ => Err(format!(
49 "{YELLOW}{s}{RESET} is not a valid package manager. Valid package mangers are [{}]",
50 PackageManager::ALL
51 .iter()
52 .map(|e| format!("{GREEN}{e}{RESET}"))
53 .collect::<Vec<_>>()
54 .join(", ")
55 )),
56 }
57 }
58}
59
60impl<'a> PackageManager {
61 pub const ALL: &'a [PackageManager] = &[
62 PackageManager::Cargo,
63 PackageManager::Pnpm,
64 PackageManager::Yarn,
65 PackageManager::Npm,
66 PackageManager::Deno,
67 PackageManager::Bun,
68 PackageManager::Dotnet,
69 ];
70
71 pub const NODE: &'a [PackageManager] = &[
73 PackageManager::Pnpm,
74 PackageManager::Yarn,
75 PackageManager::Npm,
76 PackageManager::Deno,
77 PackageManager::Bun,
78 ];
79}
80impl PackageManager {
81 pub const fn templates_no_flavors(&self) -> &[Template] {
83 match self {
84 PackageManager::Cargo => &[
85 Template::Vanilla,
86 Template::Yew,
87 Template::Leptos,
88 Template::Sycamore,
89 Template::Dioxus,
90 ],
91 PackageManager::Pnpm
92 | PackageManager::Yarn
93 | PackageManager::Npm
94 | PackageManager::Deno
95 | PackageManager::Bun => &[
96 Template::Vanilla,
97 Template::Vue,
98 Template::Svelte,
99 Template::React,
100 Template::Solid,
101 Template::Angular,
102 Template::Preact,
103 ],
104 PackageManager::Dotnet => &[Template::Blazor],
105 }
106 }
107
108 pub const fn templates(&self) -> &[Template] {
109 match self {
110 PackageManager::Cargo => &[
111 Template::Vanilla,
112 Template::Yew,
113 Template::Leptos,
114 Template::Sycamore,
115 Template::Dioxus,
116 ],
117 PackageManager::Pnpm
118 | PackageManager::Yarn
119 | PackageManager::Npm
120 | PackageManager::Deno
121 | PackageManager::Bun => &[
122 Template::Vanilla,
123 Template::VanillaTs,
124 Template::Vue,
125 Template::VueTs,
126 Template::Svelte,
127 Template::SvelteTs,
128 Template::React,
129 Template::ReactTs,
130 Template::Solid,
131 Template::SolidTs,
132 Template::Angular,
133 Template::Preact,
134 Template::PreactTs,
135 ],
136 PackageManager::Dotnet => &[Template::Blazor],
137 }
138 }
139
140 pub const fn install_cmd(&self) -> Option<&str> {
141 match self {
142 PackageManager::Pnpm => Some("pnpm install"),
143 PackageManager::Yarn => Some("yarn"),
144 PackageManager::Npm => Some("npm install"),
145 PackageManager::Deno => Some("deno install"),
146 PackageManager::Bun => Some("bun install"),
147 _ => None,
148 }
149 }
150
151 pub const fn run_cmd(&self) -> &str {
152 match self {
153 PackageManager::Cargo => "cargo",
154 PackageManager::Pnpm => "pnpm",
155 PackageManager::Yarn => "yarn",
156 PackageManager::Npm => "npm run",
157 PackageManager::Deno => "deno task",
158 PackageManager::Bun => "bun run",
159 PackageManager::Dotnet => "cargo",
160 }
161 }
162
163 pub const fn is_node(&self) -> bool {
164 matches!(
165 self,
166 PackageManager::Pnpm | PackageManager::Yarn | PackageManager::Npm
167 )
168 }
169}