ci / api / api (push) Successful in 43s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m19s
ci / desktop / rust (desktop proxy) (push) Failing after 3m34s
ci / ts / ts (packages + web) (push) Failing after 2m49s
release / release (версия и заметки) (push) Successful in 5s
ci / db / db (push) Successful in 40s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m12s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m28s
release / android (APK в релиз) (push) Failing after 2m0s
EOF Co-authored-by: Cursor <cursoragent@cursor.com>
81 lines
2.6 KiB
Rust
81 lines
2.6 KiB
Rust
use std::fs;
|
|
use std::path::PathBuf;
|
|
use tauri::{AppHandle, Manager};
|
|
|
|
const SERVICE: &str = "app.pipu.music.desktop";
|
|
|
|
fn config_dir(app: &AppHandle) -> Result<PathBuf, String> {
|
|
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<Option<String>, 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, String> {
|
|
keyring::Entry::new(SERVICE, "refresh").map_err(|e| e.to_string())
|
|
}
|
|
|
|
pub fn load_refresh() -> Result<Option<String>, 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<Option<String>, 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()),
|
|
},
|
|
}
|
|
}
|