hyprshell_core_lib/util/
exec.rs

1#[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    // pwa detection
16    if exec.contains("--app-id=") && exec.contains("--profile-directory=") {
17        // "flatpak 'run'" = pwa from browser inside flatpak
18        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            // normal PWA
39            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        // flatpak detection
48    } 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        // AppImage detection
66        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}