Skip to content

Commit 84a7487

Browse files
committed
remove old query functions and move nativestorage
1 parent f79eb01 commit 84a7487

File tree

4 files changed

+219
-328
lines changed

4 files changed

+219
-328
lines changed

src-tauri/src/main.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ mod query;
99
mod rpcs;
1010
mod samp;
1111

12+
#[path = "nativestorage/lib.rs"]
13+
mod nativestorage;
14+
15+
#[path = "deeplink/lib.rs"]
16+
#[cfg(target_os = "windows")]
17+
mod deeplink;
18+
1219
use std::env;
1320
use std::process::exit;
1421
use std::sync::Mutex;
@@ -23,10 +30,6 @@ use tauri::api::path::app_data_dir;
2330
use tauri::Manager;
2431
use tauri::PhysicalSize;
2532

26-
#[path = "deeplink/lib.rs"]
27-
#[cfg(target_os = "windows")]
28-
mod deeplink;
29-
3033
#[derive(Debug, Options)]
3134
struct CliArgs {
3235
#[options(no_short, help = "print help message")]

src-tauri/src/nativestorage/lib.rs

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
use std::fs;
2+
use std::{path::PathBuf, sync::Mutex};
3+
use std::error::Error;
4+
use actix_web::{web, HttpResponse, Responder};
5+
use lazy_static::lazy_static;
6+
use serde::Deserialize;
7+
use serde_json::{json, Value};
8+
use tokio::sync::Semaphore;
9+
10+
static STORAGE_FILE: Mutex<Option<PathBuf>> = Mutex::new(None);
11+
12+
lazy_static! {
13+
static ref SEMAPHORE: Semaphore = Semaphore::new(1);
14+
}
15+
16+
#[derive(Deserialize)]
17+
pub struct RpcParams {
18+
params: serde_json::Value,
19+
}
20+
21+
#[derive(Deserialize)]
22+
pub struct RpcMethod {
23+
method: String,
24+
}
25+
26+
#[derive(Deserialize)]
27+
struct StorageGetOrRemoveItemParams {
28+
key: String,
29+
}
30+
31+
#[derive(Deserialize)]
32+
struct StorageSetItemParams {
33+
key: String,
34+
value: String,
35+
}
36+
37+
fn storage_get_item(key: String) -> Result<Option<String>, String> {
38+
init_storage_file();
39+
let storage_file = STORAGE_FILE.lock().unwrap().to_owned().unwrap();
40+
ensure_storage_file(&storage_file)?;
41+
42+
let data = fs::read_to_string(&storage_file).map_err(|e| e.to_string())?;
43+
let json_data: Value = serde_json::from_str(&data).map_err(|e| e.to_string())?;
44+
45+
Ok(json_data
46+
.get(&key)
47+
.and_then(|v| v.as_str().map(|s| s.to_string())))
48+
}
49+
50+
fn storage_set_item(key: String, value: String) -> Result<(), String> {
51+
init_storage_file();
52+
let storage_file = STORAGE_FILE.lock().unwrap().to_owned().unwrap();
53+
ensure_storage_file(&storage_file)?;
54+
55+
let data = fs::read_to_string(&storage_file).map_err(|e| e.to_string())?;
56+
let mut json_data: Value = serde_json::from_str(&data).map_err(|e| e.to_string())?;
57+
58+
json_data[key] = json!(value);
59+
60+
fs::write(storage_file, json_data.to_string()).map_err(|e| e.to_string())?;
61+
Ok(())
62+
}
63+
64+
fn storage_remove_item(key: String) -> Result<(), String> {
65+
init_storage_file();
66+
let storage_file = STORAGE_FILE.lock().unwrap().to_owned().unwrap();
67+
ensure_storage_file(&storage_file)?;
68+
69+
let data = fs::read_to_string(&storage_file).map_err(|e| e.to_string())?;
70+
let mut json_data: Value = serde_json::from_str(&data).map_err(|e| e.to_string())?;
71+
72+
json_data.as_object_mut().map(|map| map.remove(&key));
73+
74+
fs::write(storage_file, json_data.to_string()).map_err(|e| e.to_string())?;
75+
Ok(())
76+
}
77+
78+
fn storage_get_all_items() -> Result<String, String> {
79+
init_storage_file();
80+
let storage_file = STORAGE_FILE.lock().unwrap().to_owned().unwrap();
81+
ensure_storage_file(&storage_file)?;
82+
83+
let data = fs::read_to_string(&storage_file).unwrap_or_else(|_| "{}".to_string());
84+
Ok(data)
85+
}
86+
87+
fn storage_clear() -> Result<(), String> {
88+
init_storage_file();
89+
let storage_file = STORAGE_FILE.lock().unwrap().to_owned().unwrap();
90+
ensure_storage_file(&storage_file)?;
91+
92+
fs::write(storage_file, "{}").map_err(|e| e.to_string())?;
93+
Ok(())
94+
}
95+
96+
pub async fn sync_storage_rpc_handler(
97+
path: web::Path<RpcMethod>,
98+
payload: web::Json<RpcParams>,
99+
) -> Result<impl Responder, Box<dyn Error>> {
100+
let _permit = SEMAPHORE.acquire().await.unwrap(); // Acquire a permit to ensure only one request is processed at a time
101+
let params_str = serde_json::to_string(&payload.params)?;
102+
103+
/*
104+
method: storage_get_item
105+
*/
106+
if path.method == "storage_get_item" {
107+
let params: StorageGetOrRemoveItemParams = serde_json::from_str(params_str.as_str())?;
108+
let result = storage_get_item(params.key);
109+
if result.is_err() {
110+
return Ok(
111+
HttpResponse::Ok().body(format!("storage_error|sep|{}", result.err().unwrap()))
112+
);
113+
}
114+
115+
return resolve_option_for_http_response(result.unwrap());
116+
}
117+
/*
118+
method: storage_remove_item
119+
*/
120+
else if path.method == "storage_remove_item" {
121+
let params: StorageGetOrRemoveItemParams = serde_json::from_str(params_str.as_str())?;
122+
let result = storage_remove_item(params.key);
123+
if result.is_err() {
124+
return Ok(
125+
HttpResponse::Ok().body(format!("storage_error|sep|{}", result.err().unwrap()))
126+
);
127+
}
128+
129+
return Ok(HttpResponse::Ok().body("{}"));
130+
}
131+
/*
132+
method: storage_set_item
133+
*/
134+
else if path.method == "storage_set_item" {
135+
let params: StorageSetItemParams = serde_json::from_str(params_str.as_str())?;
136+
let result = storage_set_item(params.key, params.value);
137+
if result.is_err() {
138+
return Ok(
139+
HttpResponse::Ok().body(format!("storage_error|sep|{}", result.err().unwrap()))
140+
);
141+
}
142+
143+
return Ok(HttpResponse::Ok().body("{}"));
144+
}
145+
/*
146+
method: storage_get_all_items
147+
*/
148+
else if path.method == "storage_get_all_items" {
149+
let result = storage_get_all_items();
150+
if result.is_err() {
151+
return Ok(
152+
HttpResponse::Ok().body(format!("storage_error|sep|{}", result.err().unwrap()))
153+
);
154+
}
155+
156+
return Ok(HttpResponse::Ok().body(result.unwrap()));
157+
}
158+
/*
159+
method: storage_clear
160+
*/
161+
else if path.method == "storage_clear" {
162+
let result = storage_clear();
163+
if result.is_err() {
164+
return Ok(
165+
HttpResponse::Ok().body(format!("storage_error|sep|{}", result.err().unwrap()))
166+
);
167+
}
168+
169+
return Ok(HttpResponse::Ok().body("{}"));
170+
}
171+
172+
let response = format!(
173+
"Received RPC request: {} with params: {:?}",
174+
path.method, payload.params
175+
);
176+
Ok(HttpResponse::Ok().body(response))
177+
}
178+
179+
fn ensure_storage_file(storage_file: &PathBuf) -> Result<(), String> {
180+
if !storage_file.exists() {
181+
// Create an empty JSON file
182+
fs::write(storage_file, "{}").map_err(|e| e.to_string())?;
183+
}
184+
Ok(())
185+
}
186+
187+
fn init_storage_file() {
188+
let mut storage_file_guard = STORAGE_FILE.lock().unwrap();
189+
if storage_file_guard.is_none() {
190+
*storage_file_guard = Some(PathBuf::from(format!(
191+
"{}/mp.open.launcher/storage.json",
192+
dirs_next::data_local_dir().unwrap().to_str().unwrap()
193+
)));
194+
}
195+
}
196+
197+
fn resolve_option_for_http_response(
198+
option: Option<String>,
199+
) -> Result<HttpResponse, Box<dyn Error>> {
200+
match option {
201+
Some(res) => Ok(HttpResponse::Ok().body(res)),
202+
None => Ok(HttpResponse::Ok().body("null")),
203+
}
204+
}

0 commit comments

Comments
 (0)