diff options
Diffstat (limited to 'xtask/src/install.rs')
-rw-r--r-- | xtask/src/install.rs | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/xtask/src/install.rs b/xtask/src/install.rs index 789e9f27b..78a8af797 100644 --- a/xtask/src/install.rs +++ b/xtask/src/install.rs | |||
@@ -13,8 +13,43 @@ pub struct InstallCmd { | |||
13 | pub server: Option<ServerOpt>, | 13 | pub server: Option<ServerOpt>, |
14 | } | 14 | } |
15 | 15 | ||
16 | #[derive(Clone, Copy)] | ||
16 | pub enum ClientOpt { | 17 | pub enum ClientOpt { |
17 | VsCode, | 18 | VsCode, |
19 | VsCodeInsiders, | ||
20 | VsCodium, | ||
21 | VsCodeOss, | ||
22 | Any, | ||
23 | } | ||
24 | |||
25 | impl ClientOpt { | ||
26 | pub const fn as_cmds(&self) -> &'static [&'static str] { | ||
27 | match self { | ||
28 | ClientOpt::VsCode => &["code"], | ||
29 | ClientOpt::VsCodeInsiders => &["code-insiders"], | ||
30 | ClientOpt::VsCodium => &["codium"], | ||
31 | ClientOpt::VsCodeOss => &["code-oss"], | ||
32 | ClientOpt::Any => &["code", "code-insiders", "codium", "code-oss"], | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | |||
37 | impl Default for ClientOpt { | ||
38 | fn default() -> Self { | ||
39 | ClientOpt::Any | ||
40 | } | ||
41 | } | ||
42 | |||
43 | impl std::str::FromStr for ClientOpt { | ||
44 | type Err = anyhow::Error; | ||
45 | |||
46 | fn from_str(s: &str) -> Result<Self, Self::Err> { | ||
47 | [ClientOpt::VsCode, ClientOpt::VsCodeInsiders, ClientOpt::VsCodium, ClientOpt::VsCodeOss] | ||
48 | .iter() | ||
49 | .copied() | ||
50 | .find(|c| [s] == c.as_cmds()) | ||
51 | .ok_or_else(|| anyhow::format_err!("no such client")) | ||
52 | } | ||
18 | } | 53 | } |
19 | 54 | ||
20 | pub struct ServerOpt { | 55 | pub struct ServerOpt { |
@@ -74,17 +109,13 @@ fn fix_path_for_mac() -> Result<()> { | |||
74 | Ok(()) | 109 | Ok(()) |
75 | } | 110 | } |
76 | 111 | ||
77 | fn install_client(ClientOpt::VsCode: ClientOpt) -> Result<()> { | 112 | fn install_client(client_opt: ClientOpt) -> Result<()> { |
78 | let _dir = pushd("./editors/code")?; | 113 | let _dir = pushd("./editors/code"); |
79 | 114 | ||
80 | let find_code = |f: fn(&str) -> bool| -> Result<&'static str> { | 115 | let find_code = |f: fn(&str) -> bool| -> Result<&'static str> { |
81 | ["code", "code-insiders", "codium", "code-oss"] | 116 | client_opt.as_cmds().iter().copied().find(|bin| f(bin)).ok_or_else(|| { |
82 | .iter() | 117 | format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?") |
83 | .copied() | 118 | }) |
84 | .find(|bin| f(bin)) | ||
85 | .ok_or_else(|| { | ||
86 | format_err!("Can't execute `code --version`. Perhaps it is not in $PATH?") | ||
87 | }) | ||
88 | }; | 119 | }; |
89 | 120 | ||
90 | let installed_extensions = if cfg!(unix) { | 121 | let installed_extensions = if cfg!(unix) { |