serlib/platform/
mod.rs

1#[cfg(target_os = "linux")]
2mod linux;
3#[cfg(target_os = "macos")]
4mod macos;
5
6use anyhow::Result;
7use std::path::PathBuf;
8
9#[derive(Debug, Clone)]
10pub struct ServiceRef {
11    pub name: String,
12    pub path: String,
13    pub enabled: bool,
14}
15
16#[derive(Debug, Clone)]
17pub struct Config {
18    pub default_dirs: Vec<PathBuf>,
19    pub user_dirs: Vec<PathBuf>,
20    pub system_dirs: Vec<PathBuf>,
21}
22
23#[cfg(target_os = "macos")]
24pub use macos::*;
25
26#[cfg(target_os = "linux")]
27pub use linux::*;
28
29#[derive(Copy, Clone)]
30pub enum ListLevel {
31    Default,
32    User,
33    System,
34}
35
36pub fn list_services(level: ListLevel) -> Result<Vec<ServiceRef>> {
37    let config = get_service_directories();
38    let mut services = Vec::new();
39
40    match level {
41        ListLevel::Default => {
42            for dir in &config.default_dirs {
43                let user_services = scan_directory(dir)?;
44                services.extend(user_services);
45            }
46        }
47        ListLevel::User => {
48            for dir in &config.user_dirs {
49                let user_services = scan_directory(dir)?;
50                services.extend(user_services);
51            }
52        }
53        ListLevel::System => {
54            for dir in &config.user_dirs {
55                let user_services = scan_directory(dir)?;
56                services.extend(user_services);
57            }
58            for dir in &config.system_dirs {
59                let system_services = scan_directory(dir)?;
60                services.extend(system_services);
61            }
62        }
63    }
64    Ok(services)
65}
66
67pub fn normalize_service_name(name: &str) -> &str {
68    // Normalize service names by removing leading/trailing whitespace and converting to lowercase
69    let name = name.split('@').next().unwrap();
70    name.trim_start_matches("homebrew.mxcl.")
71        .trim_end_matches(".service")
72}
73
74pub fn get_service(name: &str) -> Result<ServiceRef> {
75    let normalized_name = normalize_service_name(name);
76    let all_services = list_services(ListLevel::System)?;
77
78    if let Some(service) = all_services
79        .into_iter()
80        .find(|s| normalize_service_name(&s.name) == normalized_name)
81    {
82        return Ok(service);
83    }
84
85    Err(anyhow::anyhow!("Service '{}' not found", name))
86}
87
88pub fn resolve_service_name(name: &str) -> Result<String> {
89    let service = get_service(name)?;
90    Ok(service.name)
91}