/** * Tauri adapter for the public plugin workspace/project-structure SDK facade * (#124 + #129). The commands are plugin-scoped even though the gateway is * frontend-internal: plugins only see the stable service methods. */ import { invoke } from "@tauri-apps/api/core"; import type { PluginProjectStructure, PluginWorkspaceBinaryFile, PluginWorkspaceDirectoryListing, PluginWorkspaceStat, PluginWorkspaceTextFile, } from "@/domain"; import type { PluginProjectStructureQuery, PluginWorkspaceGateway, PluginWorkspacePathInput, PluginWorkspaceWriteBinaryInput, PluginWorkspaceWriteTextInput, } from "@/ports"; type BinaryFileDto = Omit & { bytes: number[] | Uint8Array; }; function toByteArray(bytes: number[] | Uint8Array): Uint8Array { return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes); } function normalizeBinaryFile(file: BinaryFileDto): PluginWorkspaceBinaryFile { return { ...file, bytes: toByteArray(file.bytes) }; } function binaryInput(input: PluginWorkspaceWriteBinaryInput): { projectId: string; path: string; bytes: number[]; } { return { projectId: input.projectId, path: input.path, bytes: Array.from(input.bytes), }; } export class TauriPluginWorkspaceGateway implements PluginWorkspaceGateway { readText(input: PluginWorkspacePathInput): Promise { return invoke("plugin_workspace_read_text", { input }); } async readBinary(input: PluginWorkspacePathInput): Promise { const file = await invoke("plugin_workspace_read_binary", { input }); return normalizeBinaryFile(file); } async writeText(input: PluginWorkspaceWriteTextInput): Promise { await invoke("plugin_workspace_write_text", { input }); } async writeBinary(input: PluginWorkspaceWriteBinaryInput): Promise { await invoke("plugin_workspace_write_binary", { input: binaryInput(input) }); } listDir(input: PluginWorkspacePathInput): Promise { return invoke("plugin_workspace_list_dir", { input }); } stat(input: PluginWorkspacePathInput): Promise { return invoke("plugin_workspace_stat", { input }); } queryProjectStructure(input: PluginProjectStructureQuery): Promise { return invoke("plugin_query_project_structure", { input }); } }