Skip to main content

crosup_types/
curl.rs

1use indexmap::IndexMap;
2use serde::{Deserialize, Serialize};
3
4#[derive(Serialize, Deserialize, Debug, Clone, Default)]
5pub struct CurlConfiguration {
6    #[serde(serialize_with = "hcl::ser::labeled_block")]
7    pub script: IndexMap<String, Script>,
8}
9
10#[derive(Serialize, Deserialize, Debug, Clone, Default)]
11pub struct Script {
12    #[serde(skip_serializing, skip_deserializing)]
13    pub name: String,
14    pub url: String,
15
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub enable_sudo: Option<bool>,
18
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub postinstall: Option<String>,
21
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub version_check: Option<String>,
24
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub args: Option<String>,
27
28    #[serde(
29        skip_serializing_if = "Option::is_none",
30        serialize_with = "hcl::ser::block"
31    )]
32    pub env: Option<IndexMap<String, String>>,
33
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub shell: Option<String>,
36
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub depends_on: Option<Vec<String>>,
39}
40
41pub fn default_nix_installer() -> Script {
42    Script {
43        name: "nix".into(),
44        url: "https://install.determinate.systems/nix".into(),
45        enable_sudo: Some(true),
46        args: Some("install --no-confirm".into()),
47        ..Default::default()
48    }
49}
50
51pub fn default_brew_installer() -> Script {
52    let postinstall = match std::env::consts::OS {
53        "macos" => Some("echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> ~/.zprofile".into()),
54        "linux" => {
55            Some("echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc".into())
56        }
57        _ => None,
58    };
59
60    Script {
61        name: "homebrew".into(),
62        url: "https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh".into(),
63        postinstall,
64        version_check: Some("brew".into()),
65        env: Some(
66            [("NONINTERACTIVE".into(), "true".into())]
67                .iter()
68                .cloned()
69                .collect(),
70        ),
71        shell: Some("bash".into()),
72        ..Default::default()
73    }
74}
75
76pub fn default_curl_install() -> IndexMap<String, CurlConfiguration> {
77    let mut script = IndexMap::new();
78    script.insert(
79        "devbox".into(),
80        Script {
81            name: "devbox".into(),
82            url: "https://get.jetpack.io/devbox".into(),
83            shell: Some("bash".into()),
84            depends_on: Some(vec!["nix".into()]),
85            env: Some([("FORCE".into(), "1".into())].iter().cloned().collect()),
86            ..Default::default()
87        },
88    );
89
90    script.insert(
91        "atuin".into(),
92        Script {
93            name: "atuin".into(),
94            url: "https://raw.githubusercontent.com/ellie/atuin/main/install.sh".into(),
95            shell: Some("bash".into()),
96            ..Default::default()
97        },
98    );
99
100    script.insert("nix".into(), default_nix_installer());
101
102    script.insert("homebrew".into(), default_brew_installer());
103
104    let mut curl = IndexMap::new();
105    curl.insert("install".into(), CurlConfiguration { script });
106    curl
107}