{"record":{"id":"9c65fe103e992ed1","repo":"tonhowtf/omniget","slug":"sem-pasta-de-dados-trakt","errorCode":null,"errorMessage":"sem pasta de dados","messagePattern":"sem pasta de dados","errorType":"exception","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/lists/trakt.rs","lineNumber":92,"sourceCode":"        }\n    }\n}\n\nstatic LOCK: Mutex<()> = Mutex::new(());\n\nfn file() -> Option<std::path::PathBuf> {\n    crate::core::tools::tools_dir().map(|d| d.join(\"lists-trakt.json\"))\n}\n\nfn load() -> Creds {\n    file()\n        .and_then(|p| std::fs::read_to_string(p).ok())\n        .and_then(|s| serde_json::from_str(&s).ok())\n        .unwrap_or_default()\n}\n\nfn store(c: &Creds) -> Result<()> {\n    let p = file().ok_or_else(|| anyhow!(\"sem pasta de dados\"))?;\n    if let Some(parent) = p.parent() {\n        std::fs::create_dir_all(parent)?;\n    }\n    let tmp = p.with_extension(\"json.tmp\");\n    std::fs::write(&tmp, serde_json::to_string_pretty(c)?)?;\n    std::fs::rename(&tmp, &p)?;\n    Ok(())\n}\n\npub fn creds_view() -> CredsView {\n    let _g = LOCK.lock().unwrap_or_else(|e| e.into_inner());\n    load().view()\n}\n\n/// Grava as credenciais da app do usuário. Campo em branco mantém o que já\n/// estava guardado (a UI nunca recebe o segredo de volta para reenviar).\npub fn save_app(client_id: &str, client_secret: &str) -> Result<CredsView> {\n    let _g = LOCK.lock().unwrap_or_else(|e| e.into_inner());","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/lists/trakt.rs#L74-L110","documentation":"trakt::store persists Trakt credentials to a JSON file under the app data directory, resolved by file(). If file() returns None (no data directory could be determined), store fails with 'sem pasta de dados' before any write is attempted. This is a hard environment prerequisite for saving/disconnecting Trakt credentials.","triggerScenarios":"Calling store() (directly or via save_app, save_token, disconnect, forget, run) on a system where the data directory cannot be resolved — e.g. missing XDG_DATA_HOME/HOME on Linux or an unset app-data path in the embedding environment.","commonSituations":"Running the app in a sandboxed/containerized environment without HOME set; unusual embedded runtime without a configured data dir; custom user setup with no writable home directory.","solutions":["Ensure HOME (Linux/macOS) is set to a writable directory before launching the app","On Linux, set XDG_DATA_HOME explicitly to a writable path","Launch the app normally via the desktop environment so the OS data dir is resolvable","Create the expected app data directory manually and verify write permissions"],"exampleFix":"// before (container)\nCMD [\"./app\"]\n// after\nENV HOME=/home/app\nENV XDG_DATA_HOME=/home/app/.local/share\nCMD [\"./app\"]","handlingStrategy":"validation","validationCode":"let data_dir = std::env::var(\"XDG_DATA_HOME\")\n    .or_else(|_| std::env::var(\"HOME\").map(|h| format!(\"{h}/.local/share\")));\nif data_dir.is_err() {\n    eprintln!(\"defina HOME ou XDG_DATA_HOME antes de executar\");\n}","typeGuard":null,"tryCatchPattern":"match trakt::save_token(&token) {\n    Err(e) if e.to_string().contains(\"sem pasta de dados\") => {\n        eprintln!(\"configure a pasta de dados (HOME/XDG_DATA_HOME) e tente de novo\");\n    }\n    other => other?,\n}","preventionTips":["Always launch with HOME (and XDG_DATA_HOME on Linux) pointing to a writable directory","In containers, create and mount a persistent volume for the app data dir","Test data-dir resolution early at app startup, not at first credential write"],"tags":["filesystem","config","data-directory"],"backgroundTag":"missing-env-var","analyzedSha":"8600b91f4246848bac346874daa9e61c1fc5677a","analyzedAt":"2026-09-12T14:29:19.317Z","contentChangedAt":"2026-09-12T14:29:19.317Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}