hyprshell_core_lib/util/
exec.rs1#[derive(Debug, Clone)]
2pub enum ExecType {
3 Flatpak(Box<str>, Box<str>),
4 PWA(Box<str>, Box<str>),
5 FlatpakPWA(Box<str>, Box<str>),
6 Absolute(Box<str>, Box<str>),
7 AppImage(Box<str>, Box<str>),
8 Relative(Box<str>),
9}
10
11const UNKNOWN_EXEC: &str = "unknown";
12
13pub fn analyse_exec(exec: &str) -> ExecType {
14 let exec_trim = exec.replace("'", "").replace("\"", "");
15 if exec.contains("--app-id=") && exec.contains("--profile-directory=") {
17 if exec.contains("flatpak run") || exec.contains("flatpak 'run'") {
19 let browser_exec_in_flatpak = exec_trim
20 .split_whitespace()
21 .find(|s| s.contains("--command="))
22 .and_then(|s| {
23 s.split('=')
24 .next_back()
25 .and_then(|s| s.split('/').next_back())
26 })
27 .unwrap_or(UNKNOWN_EXEC);
28 let flatpak_identifier = exec_trim
29 .split_whitespace()
30 .skip(2)
31 .find(|arg| !arg.starts_with("--"))
32 .unwrap_or(UNKNOWN_EXEC);
33 ExecType::FlatpakPWA(
34 Box::from(flatpak_identifier),
35 Box::from(browser_exec_in_flatpak),
36 )
37 } else {
38 let browser_exec = exec
40 .split_whitespace()
41 .next()
42 .and_then(|s| s.split('/').next_back())
43 .unwrap_or(UNKNOWN_EXEC);
44 let browser_full_exec = exec.split_whitespace().next().unwrap_or(UNKNOWN_EXEC);
45 ExecType::PWA(Box::from(browser_exec), Box::from(browser_full_exec))
46 }
47 } else if exec.contains("flatpak run") || exec.contains("flatpak 'run'") {
49 let command_in_flatpak = exec_trim
50 .split_whitespace()
51 .find(|s| s.contains("--command="))
52 .and_then(|s| {
53 s.split('=')
54 .next_back()
55 .and_then(|s| s.split('/').next_back())
56 })
57 .unwrap_or(UNKNOWN_EXEC);
58 let flatpak_identifier = exec_trim
59 .split_whitespace()
60 .skip(2)
61 .find(|arg| !arg.starts_with("--"))
62 .unwrap_or(UNKNOWN_EXEC);
63 ExecType::Flatpak(Box::from(flatpak_identifier), Box::from(command_in_flatpak))
64 } else if exec_trim.contains(".AppImage") {
65 let appimage_name = exec_trim
67 .split_whitespace()
68 .next()
69 .and_then(|s| s.split('/').next_back())
70 .and_then(|s| s.split('_').next())
71 .unwrap_or(UNKNOWN_EXEC);
72 ExecType::AppImage(Box::from(appimage_name), Box::from(exec))
73 } else if exec_trim.starts_with("/") {
74 let exec_name = exec_trim
75 .split_whitespace()
76 .next()
77 .and_then(|s| s.split('/').next_back())
78 .unwrap_or(UNKNOWN_EXEC);
79 ExecType::Absolute(Box::from(exec_name), Box::from(exec))
80 } else {
81 ExecType::Relative(Box::from(exec_trim))
82 }
83}