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 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}