Wann du es brauchst
Die UI braucht eine sofortige Antwort vom Rust-Kern, zum Beispiel die Größe der
lokalen Datenbank oder Details zu einer gewählten Datei. Die Schritte verwenden
einen Befehl storage_info als Beispiel. Arbeit, die länger als einen Moment
dauern kann (einen Ordnerbaum lesen, Netzwerk, Geräte), ist ein Job: siehe das
Playbook "Einen Job-Handler hinzufügen".
Regeln
- Der Weg ist immer UI →
packages/native-client→ Tauri-Befehl →crates/app-api→ Core-Crates. Der Befehl ruft nur eine Methode vonAppApiauf; keine Logik inapps/desktop/src-tauri. - Jeder Befehl braucht eine eigene Berechtigung in
apps/desktop/src-tauri/capabilities/main-window.json. Keine globalen oder Wildcard-Berechtigungen. - Typen überqueren die Grenze als DTOs aus
crates/app-api/src/dto.rs; die TypeScript-Versionen werden generiert, nie von Hand geschrieben. - Fehler sind
ApiError-Werte mit einem stabilenRW_*-Code, nie Sätze. Die UI übersetzt den Code. - Ein Pfad aus der UI läuft durch
validate_path, bevor er verwendet wird.
Schritte
Ergänze das DTO in
crates/app-api/src/dto.rsmit denselben Derives und Attributen wie die anderen (Serialize,Deserialize, dascfg_attrfürts-exportundrename_all = "camelCase"). Markiereu64-Felder wie inJobDtomitts(type = "number"):#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "ts-export", derive(TS), ts(export))] #[serde(rename_all = "camelCase")] pub struct StorageInfoDto { pub data_dir: String, #[cfg_attr(feature = "ts-export", ts(type = "number"))] pub database_bytes: u64, }Ergänze die Methode in
AppApiincrates/app-api/src/api.rs, mit RückgabeResult<StorageInfoDto, ApiError>. Baue Fehler mitApiError::new("RW_...", category, recoverable)und prüfe deaktivierte Module wie die vorhandenen Methoden. Teste sie incrates/app-api/tests/api.rsmit dem Helferapi(config()), auch den Fehlerfall.Führe
pnpm types:generateaus, exportiere den neuen Typ auspackages/shared-types/src/index.tsund committe die Dateien inpackages/shared-types/src/generated.pnpm types:checkschlägt fehl, wenn sie veraltet sind.Lege den Befehl in der passenden Datei in
apps/desktop/src-tauri/src/commands/an (hierfilesystem.rs), nach dem Muster vonvalidate_path: Er nimmtState<'_>und die Argumente und gibtstate.api.storage_info()zurück. Registriere ihn ingenerate_handler!insrc-tauri/src/main.rs, deklariere"storage_info"inbuild.rsund erlaube"allow-storage-info"incapabilities/main-window.json.Ergänze die Methode im Interface
NativeClientinpackages/native-client/src/client.ts, inTauriNativeClientintauri.ts(call<StorageInfoDto>("storage_info"); JavaScript-Argumente sind camelCase, Tauri bildet sie auf snake_case ab) und inMockNativeClientinmock.tsmit realistischen Daten und den Fehlerszenarien. Teste den Mock inmock.test.ts.Lies den Wert in der UI mit einem Hook unter
apps/desktop/src/features/<feature>/hooks/, wieuseFeatures:useQuerymit stabilem Schlüssel unduseNativeClient(). Zeige Fehler miti18n.erroran.Ergänze jeden neuen
RW_*-Code inpackages/i18n/locales/*/errors.jsonund jeden UI-Text incommon.json, in de-DE, en und it-IT. Prüfe das Layout auf Deutsch.Führe den Befehl in
docs/tauri-bridge.mdauf.
Fertig, wenn
- die Prüfbefehle durchlaufen und
pnpm types:checkkeinen Unterschied meldet; - der Befehl genau einen Eintrag
allow-<name>in der Capability hat und inmain.rsundbuild.rsregistriert ist; - der Mock die Methode implementiert, damit
pnpm devohne Rust-Kern funktioniert; - jeder neue Code und Text in den drei Sprachen existiert.
