use std::fs; use std::path::PathBuf; use tauri::{AppHandle, Manager}; const SERVICE: &str = "app.pipu.music.desktop"; fn config_dir(app: &AppHandle) -> Result { let dir = app.path().app_config_dir().map_err(|e| e.to_string())?; fs::create_dir_all(&dir).map_err(|e| e.to_string())?; Ok(dir) } pub fn load_server(app: &AppHandle) -> Result, String> { let path = config_dir(app)?.join("server.txt"); match fs::read_to_string(path) { Ok(s) => { let s = s.trim().to_string(); Ok((!s.is_empty()).then_some(s)) } Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None), Err(e) => Err(e.to_string()), } } pub fn save_server(app: &AppHandle, server: Option<&str>) -> Result<(), String> { let path = config_dir(app)?.join("server.txt"); match server { Some(s) => fs::write(path, s).map_err(|e| e.to_string()), None => match fs::remove_file(path) { Ok(()) => Ok(()), Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(()), Err(e) => Err(e.to_string()), }, } } fn refresh_entry() -> Result { keyring::Entry::new(SERVICE, "refresh").map_err(|e| e.to_string()) } pub fn load_refresh() -> Result, String> { match refresh_entry()?.get_password() { Ok(s) => Ok(Some(s)), Err(keyring::Error::NoEntry) => Ok(None), Err(e) => Err(e.to_string()), } } pub fn save_refresh(token: Option<&str>) -> Result<(), String> { let entry = refresh_entry()?; match token { Some(t) => entry.set_password(t).map_err(|e| e.to_string()), None => match entry.delete_credential() { Ok(()) => Ok(()), Err(keyring::Error::NoEntry) => Ok(()), Err(e) => Err(e.to_string()), }, } } pub fn load_user(app: &AppHandle) -> Result, String> { let path = config_dir(app)?.join("user.json"); match fs::read_to_string(path) { Ok(s) => Ok(Some(s)), Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(None), Err(e) => Err(e.to_string()), } } pub fn save_user(app: &AppHandle, json: Option<&str>) -> Result<(), String> { let path = config_dir(app)?.join("user.json"); match json { Some(s) => fs::write(path, s).map_err(|e| e.to_string()), None => match fs::remove_file(path) { Ok(()) => Ok(()), Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(()), Err(e) => Err(e.to_string()), }, } }