Skip to main content

create_tauri_app/
package_manager.rs

1// Copyright 2019-2022 Tauri Programme within The Commons Conservancy
2// SPDX-License-Identifier: Apache-2.0
3// SPDX-License-Identifier: MIT
4
5use 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    /// Node.js managers
72    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    /// Returns templates without flavors
82    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}