This repository has been archived on 2026-04-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
chrom-tool/src-tauri/src/browsers.rs
2026-04-16 21:47:00 -04:00

149 lines
5.0 KiB
Rust

use std::{env, path::PathBuf};
use crate::models::BrowserDefinition;
pub fn browser_definitions() -> Vec<BrowserDefinition> {
vec![
BrowserDefinition {
id: "chrome",
name: "Google Chrome",
local_app_data_segments: &["Google", "Chrome", "User Data"],
executable_candidates: &[
ExecutableCandidate::ProgramFiles(&[
"Google",
"Chrome",
"Application",
"chrome.exe",
]),
ExecutableCandidate::ProgramFilesX86(&[
"Google",
"Chrome",
"Application",
"chrome.exe",
]),
ExecutableCandidate::LocalAppData(&[
"Google",
"Chrome",
"Application",
"chrome.exe",
]),
],
},
BrowserDefinition {
id: "edge",
name: "Microsoft Edge",
local_app_data_segments: &["Microsoft", "Edge", "User Data"],
executable_candidates: &[
ExecutableCandidate::ProgramFilesX86(&[
"Microsoft",
"Edge",
"Application",
"msedge.exe",
]),
ExecutableCandidate::ProgramFiles(&[
"Microsoft",
"Edge",
"Application",
"msedge.exe",
]),
],
},
BrowserDefinition {
id: "brave",
name: "Brave",
local_app_data_segments: &["BraveSoftware", "Brave-Browser", "User Data"],
executable_candidates: &[
ExecutableCandidate::ProgramFiles(&[
"BraveSoftware",
"Brave-Browser",
"Application",
"brave.exe",
]),
ExecutableCandidate::ProgramFilesX86(&[
"BraveSoftware",
"Brave-Browser",
"Application",
"brave.exe",
]),
ExecutableCandidate::LocalAppData(&[
"BraveSoftware",
"Brave-Browser",
"Application",
"brave.exe",
]),
],
},
BrowserDefinition {
id: "vivaldi",
name: "Vivaldi",
local_app_data_segments: &["Vivaldi", "User Data"],
executable_candidates: &[
ExecutableCandidate::LocalAppData(&["Vivaldi", "Application", "vivaldi.exe"]),
ExecutableCandidate::ProgramFiles(&["Vivaldi", "Application", "vivaldi.exe"]),
],
},
BrowserDefinition {
id: "yandex",
name: "Yandex Browser",
local_app_data_segments: &["Yandex", "YandexBrowser", "User Data"],
executable_candidates: &[ExecutableCandidate::LocalAppData(&[
"Yandex",
"YandexBrowser",
"Application",
"browser.exe",
])],
},
BrowserDefinition {
id: "chromium",
name: "Chromium",
local_app_data_segments: &["Chromium", "User Data"],
executable_candidates: &[
ExecutableCandidate::LocalAppData(&["Chromium", "Application", "chrome.exe"]),
ExecutableCandidate::ProgramFiles(&["Chromium", "Application", "chrome.exe"]),
],
},
]
}
pub fn browser_definition_by_id(browser_id: &str) -> Option<BrowserDefinition> {
browser_definitions()
.into_iter()
.find(|definition| definition.id == browser_id)
}
pub fn resolve_browser_executable(browser_id: &str) -> Option<PathBuf> {
let definition = browser_definition_by_id(browser_id)?;
definition
.executable_candidates
.iter()
.filter_map(resolve_executable_candidate)
.find(|path| path.is_file())
}
fn resolve_executable_candidate(candidate: &ExecutableCandidate) -> Option<PathBuf> {
match candidate {
ExecutableCandidate::ProgramFiles(segments) => env::var_os("ProgramFiles")
.map(PathBuf::from)
.map(|root| join_segments(root, segments)),
ExecutableCandidate::ProgramFilesX86(segments) => env::var_os("ProgramFiles(x86)")
.map(PathBuf::from)
.map(|root| join_segments(root, segments)),
ExecutableCandidate::LocalAppData(segments) => env::var_os("LOCALAPPDATA")
.map(PathBuf::from)
.map(|root| join_segments(root, segments)),
}
}
fn join_segments(mut root: PathBuf, segments: &[&str]) -> PathBuf {
for segment in segments {
root.push(segment);
}
root
}
pub enum ExecutableCandidate {
ProgramFiles(&'static [&'static str]),
ProgramFilesX86(&'static [&'static str]),
LocalAppData(&'static [&'static str]),
}