support custom userdata

This commit is contained in:
Julian Freeman
2026-04-16 14:50:38 -04:00
parent 436797abfa
commit a8ad89074f
9 changed files with 748 additions and 76 deletions

View File

@@ -1,43 +1,32 @@
use std::{
collections::{BTreeMap, BTreeSet},
fs,
path::Path,
path::{Path, PathBuf},
};
use serde_json::Value;
use tauri::AppHandle;
use crate::{
browsers::browser_definitions,
config_store,
models::{
BookmarkSummary, BrowserDefinition, BrowserStats, BrowserView, ExtensionSummary,
BookmarkSummary, BrowserConfigEntry, BrowserStats, BrowserView, ExtensionSummary,
ProfileSummary, ScanResponse, TempBookmark, TempExtension,
},
utils::{
first_non_empty, load_image_as_data_url, local_app_data_dir, pick_latest_subdirectory,
read_json_file,
},
utils::{first_non_empty, load_image_as_data_url, pick_latest_subdirectory, read_json_file},
};
pub fn scan_browsers() -> Result<ScanResponse, String> {
let local_app_data = local_app_data_dir().ok_or_else(|| {
"Unable to resolve the LOCALAPPDATA directory for the current user.".to_string()
})?;
let browsers = browser_definitions()
pub fn scan_browsers(app: &AppHandle) -> Result<ScanResponse, String> {
let browsers = config_store::resolve_browser_configs(app)?
.into_iter()
.filter_map(|definition| scan_browser(&local_app_data, definition))
.filter_map(scan_browser)
.collect();
Ok(ScanResponse { browsers })
}
fn scan_browser(local_app_data: &Path, definition: BrowserDefinition) -> Option<BrowserView> {
let root = definition
.local_app_data_segments
.iter()
.fold(local_app_data.to_path_buf(), |path, segment| {
path.join(segment)
});
fn scan_browser(config: BrowserConfigEntry) -> Option<BrowserView> {
let root = PathBuf::from(&config.user_data_path);
if !root.is_dir() {
return None;
@@ -99,8 +88,9 @@ fn scan_browser(local_app_data: &Path, definition: BrowserDefinition) -> Option<
.collect::<Vec<_>>();
Some(BrowserView {
browser_id: definition.id.to_string(),
browser_name: definition.name.to_string(),
browser_id: config.id,
browser_family_id: config.browser_family_id,
browser_name: config.name,
data_root: root.display().to_string(),
stats: BrowserStats {
profile_count: profiles.len(),