Skip to main content

crosup_types/
brew.rs

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        // determine linux distribution using os-release
43        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}