1use indexmap::IndexMap;
2use os_release::OsRelease;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Default)]
6pub struct BrewConfiguration {
7 #[serde(skip_serializing_if = "Option::is_none")]
8 pub pkgs: Option<Vec<String>>,
9
10 #[serde(
11 skip_serializing_if = "Option::is_none",
12 serialize_with = "hcl::ser::labeled_block"
13 )]
14 pub pkg: Option<IndexMap<String, Package>>,
15}
16
17#[derive(Serialize, Deserialize, Debug, Clone, Default)]
18pub struct Package {
19 #[serde(skip_serializing, skip_deserializing)]
20 pub name: String,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub preinstall: Option<String>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub postinstall: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub version_check: Option<String>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub cask: Option<bool>,
29}
30
31pub fn default_brew_install() -> IndexMap<String, BrewConfiguration> {
32 let mut brew = IndexMap::new();
33 let mut pkg = IndexMap::new();
34 let mut minikube = super::brew::Package {
35 name: "minikube".into(),
36 preinstall: None,
37 postinstall: None,
38 ..Default::default()
39 };
40
41 if cfg!(target_os = "linux") {
42 if let Ok(os_release) = OsRelease::new() {
44 let os = os_release.id.to_lowercase();
45 let os = os.as_str();
46 match os {
47 "ubuntu" | "debian" | "linuxmint" | "pop" | "elementary" | "zorin" => {
48 minikube.preinstall = Some(
49 "sudo apt-get install -y qemu-system libvirt-clients libvirt-daemon-system"
50 .into(),
51 );
52 minikube.postinstall = Some(
53 r#"sudo sed -i 's/#user = "root"/user = "root"/g' /etc/libvirt/qemu.conf
54 sudo sed -i 's/#group = "root"/group = "root"/g' /etc/libvirt/qemu.conf
55 sudo sed -i 's/#dynamic_ownership = 1/dynamic_ownership = 0/g' /etc/libvirt/qemu.conf
56 sudo sed -i 's/#remember_owner = 1/remember_owner = 0/g' /etc/libvirt/qemu.conf"#
57 .into(),
58 );
59 }
60 _ => {}
61 }
62 }
63 }
64
65 pkg.insert("minikube".into(), minikube);
66
67 pkg.insert(
68 "tilt".into(),
69 super::brew::Package {
70 ..Default::default()
71 },
72 );
73
74 pkg.insert(
75 "kubernetes-cli".into(),
76 super::brew::Package {
77 version_check: Some("kubectl".into()),
78 ..Default::default()
79 },
80 );
81
82 pkg.insert(
83 "bat".into(),
84 super::brew::Package {
85 ..Default::default()
86 },
87 );
88
89 pkg.insert(
90 "direnv".into(),
91 super::brew::Package {
92 ..Default::default()
93 },
94 );
95
96 pkg.insert(
97 "eza".into(),
98 super::brew::Package {
99 ..Default::default()
100 },
101 );
102
103 pkg.insert(
104 "fd".into(),
105 super::brew::Package {
106 ..Default::default()
107 },
108 );
109
110 pkg.insert(
111 "fzf".into(),
112 super::brew::Package {
113 ..Default::default()
114 },
115 );
116
117 pkg.insert(
118 "fish".into(),
119 super::brew::Package {
120 ..Default::default()
121 },
122 );
123
124 pkg.insert(
125 "glow".into(),
126 super::brew::Package {
127 ..Default::default()
128 },
129 );
130
131 pkg.insert(
132 "httpie".into(),
133 super::brew::Package {
134 version_check: Some("http".into()),
135 ..Default::default()
136 },
137 );
138
139 pkg.insert(
140 "tig".into(),
141 super::brew::Package {
142 ..Default::default()
143 },
144 );
145
146 pkg.insert(
147 "zellij".into(),
148 super::brew::Package {
149 ..Default::default()
150 },
151 );
152
153 pkg.insert(
154 "zoxide".into(),
155 super::brew::Package {
156 ..Default::default()
157 },
158 );
159
160 pkg.insert(
161 "ripgrep".into(),
162 super::brew::Package {
163 version_check: Some("rg".into()),
164 ..Default::default()
165 },
166 );
167
168 pkg.insert(
169 "neovim".into(),
170 super::brew::Package {
171 version_check: Some("nvim".into()),
172 ..Default::default()
173 },
174 );
175
176 if cfg!(target_os = "macos") {
177 pkg.insert(
178 "docker".into(),
179 super::brew::Package {
180 cask: Some(true),
181 ..Default::default()
182 },
183 );
184 pkg.insert(
185 "visual-studio-code".into(),
186 super::brew::Package {
187 cask: Some(true),
188 version_check: Some("code".into()),
189 ..Default::default()
190 },
191 );
192 }
193
194 brew.insert(
195 "install".into(),
196 BrewConfiguration {
197 pkg: Some(pkg),
198 ..Default::default()
199 },
200 );
201 brew
202}