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}