{"record":{"id":"14c2427a8b436cac","repo":"tonhowtf/omniget","slug":"caminho-de-modelo-sem-pasta","errorCode":null,"errorMessage":"caminho de modelo sem pasta","messagePattern":"caminho de modelo sem pasta","errorType":"exception","errorClass":"anyhow","httpStatus":null,"severity":"error","filePath":"src-tauri/omniget-core/src/core/tools/onnx.rs","lineNumber":201,"sourceCode":"        if n == 0 {\n            break;\n        }\n        hasher.update(&buf[..n]);\n    }\n    Ok(hex::encode(hasher.finalize()))\n}\n\n/// Garante o modelo no disco. Se já está lá com o tamanho certo, não baixa de\n/// novo. O sha256 é conferido no arquivo recém-baixado, antes de virar oficial.\npub async fn ensure_model(id: &str, progress: &ProgressFn) -> anyhow::Result<PathBuf> {\n    let spec = find(id).ok_or_else(|| anyhow!(\"modelo desconhecido: {id}\"))?;\n    let dest = model_path(id).ok_or_else(|| anyhow!(\"não achei o diretório de dados do app\"))?;\n    if is_downloaded(id) {\n        return Ok(dest);\n    }\n    let dir = dest\n        .parent()\n        .ok_or_else(|| anyhow!(\"caminho de modelo sem pasta\"))?\n        .to_path_buf();\n    std::fs::create_dir_all(&dir).with_context(|| format!(\"criando {}\", dir.display()))?;\n\n    let tmp = dir.join(format!(\".{id}.onnx.download\"));\n    let client = super::client()?;\n    let pid = format!(\"onnx-model:{id}\");\n    super::download_to(&client, spec.url, &tmp, progress, &pid).await?;\n\n    let expected = spec.sha256.to_string();\n    let tmp2 = tmp.clone();\n    let dest2 = dest.clone();\n    let p = progress.clone();\n    let pid2 = pid.clone();\n    tokio::task::spawn_blocking(move || -> anyhow::Result<()> {\n        super::report(\n            &p,\n            &pid2,\n            \"verify\",","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/tonhowtf/omniget/blob/8600b91f4246848bac346874daa9e61c1fc5677a/src-tauri/omniget-core/src/core/tools/onnx.rs#L183-L219","documentation":"`ensure_model` derives the download directory as `dest.parent()`; since `model_path` always joins a filename onto models_dir, a None parent is an internal invariant violation ('caminho de modelo sem pasta'). In practice this is defensive code and effectively unreachable unless model_path's construction changes.","triggerScenarios":"Theoretically any `ensure_model` call would trigger this only if `model_path(id)` ever returned a path without a parent component (e.g. a bare relative filename after a refactor of model_path/models_dir).","commonSituations":"Only after code changes: someone edits `models_dir()` or `model_path()` to return a root-level or relative path; custom forks that alter the models directory layout.","solutions":["If you hit it, inspect `models_dir()`/`model_path()` in core/tools/onnx.rs — the path construction lost its directory component; restore the `tools_dir().join(\"models\").join(\"onnx\")` structure.","As a caller, nothing you can pass to ensure_model causes this; fix the library code instead.","Add a unit test asserting `model_path(\"u2netp\")` has a parent to catch regressions."],"exampleFix":"// before\npub fn models_dir() -> Option<PathBuf> { super::tools_dir().map(|d| d.join(\"onnx\")) }\n// after\npub fn models_dir() -> Option<PathBuf> { super::tools_dir().map(|d| d.join(\"models\").join(\"onnx\")) }","handlingStrategy":"try-catch","validationCode":"// callers cannot prevent this; it indicates a library bug in models_dir()/model_path()\n// guard: ensure the models dir resolves before calling\nif onnx::status(None).models_dir.is_none() { return Err(anyhow!(\"models_dir nao resolve\")); }","typeGuard":null,"tryCatchPattern":"match onnx::ensure_model(id, &progress).await {\n    Err(e) if e.to_string().contains(\"sem pasta\") => {\n        anyhow::bail!(\"bug interno no caminho de modelos; reporte com o log\");\n    }\n    other => other,\n}","preventionTips":["Keep a unit test asserting model_path(id).unwrap().parent().is_some() for every catalog id.","Avoid refactors that make models_dir() return a bare filename or empty path.","Treat this error as a bug report trigger, not a user-facing condition."],"tags":["onnx","invariant","filesystem","internal"],"backgroundTag":"internal-invariant-violation","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"}