1use std::path::Path;
2
3use ytil_sys::Arch;
4use ytil_sys::Os;
5use ytil_sys::SysInfo;
6
7use crate::downloaders::curl::CurlDownloaderOption;
8use crate::installers::Installer;
9use crate::installers::SystemDependent;
10
11pub struct Deno<'a> {
12 pub bin_dir: &'a Path,
13 pub sys_info: &'a SysInfo,
14}
15
16impl SystemDependent for Deno<'_> {
17 fn target_arch_and_os(&self) -> (&str, &str) {
18 let SysInfo { os, arch } = self.sys_info;
19 let os = match os {
20 Os::MacOs => "apple-darwin",
21 Os::Linux => "unknown-linux",
22 };
23 let arch = match arch {
24 Arch::Arm => "aarch64",
25 Arch::X86 => "x86_64",
26 };
27 (arch, os)
28 }
29}
30
31impl Installer for Deno<'_> {
32 fn bin_name(&self) -> &'static str {
33 "deno"
34 }
35
36 fn install(&self) -> color_eyre::Result<()> {
37 let repo = format!("{0}land/{0}", self.bin_name());
38 let latest_release = ytil_gh::get_latest_release(&repo)?;
39
40 let (arch, os) = self.target_arch_and_os();
41
42 let target = crate::downloaders::curl::run(
43 &format!(
44 "https://github.com/{repo}/releases/download/{latest_release}/{}-{arch}-{os}.zip",
45 self.bin_name()
46 ),
47 &CurlDownloaderOption::PipeIntoTar {
48 dest_dir: self.bin_dir,
49 dest_name: Some(self.bin_name()),
50 },
51 )?;
52
53 ytil_sys::file::chmod_x(&target)?;
54
55 Ok(())
56 }
57}