game_manager_lib/commands/metadata/
protondb.rs1use crate::database::AppState;
2use crate::errors::AppError;
3use crate::services::cache;
4use crate::services::integration::protondb;
5use crate::services::integration::protondb::{is_running_on_linux, ProtonDbSummary};
6use tauri::State;
7
8#[tauri::command]
9pub async fn fetch_protondb_data(
10 state: State<'_, AppState>,
11 steam_app_id: String,
12) -> Result<Option<ProtonDbSummary>, AppError> {
13 if !is_running_on_linux() {
14 return Ok(None); }
16
17 let cache_key = format!("protondb_{}", steam_app_id);
18
19 let cached_summary = {
21 let cache_conn = state.cache_db.lock().map_err(|_| AppError::MutexError)?;
22 cache::get_cached_api_data(&cache_conn, "protondb", &cache_key)
23 };
24
25 if let Some(cached) = cached_summary {
26 if let Ok(summary) = serde_json::from_str(&cached) {
27 return Ok(Some(summary));
28 }
29 }
30
31 match protondb::get_compatibility_summary(&steam_app_id).await {
33 Ok(Some(summary)) => {
34 if let Ok(json) = serde_json::to_string(&summary) {
35 let cache_conn = state.cache_db.lock().map_err(|_| AppError::MutexError)?;
36 let _ = cache::save_cached_api_data(&cache_conn, "protondb", &cache_key, &json);
38 }
39 Ok(Some(summary))
40 }
41 Ok(None) => Ok(None),
42 Err(e) => {
43 tracing::warn!("ProtonDB falhou para app_id '{}': {}", steam_app_id, e);
44 Ok(None) }
46 }
47}