import { EMPTY_PROJECT_CONFIG, getProjectConfigPath, type ProjectConfig, } from "@/model/projectConfig"; import { IConfigProvider, IFileSystem } from "@/ports"; import { parseProjectConfig } from "./parseProjectConfig"; import { serializeProjectConfig } from "./serializeProjectConfig"; export class ProjectConfigService { #fs: IFileSystem; #config: IConfigProvider; constructor(fs: IFileSystem, config: IConfigProvider) { this.#fs = fs; this.#config = config; } async load(): Promise { const folderPath = this.#config.getProjectTaskPath(); if (!folderPath) return { ...EMPTY_PROJECT_CONFIG }; const path = getProjectConfigPath(folderPath); try { const content = await this.#fs.readFile(path); const parsed = parseProjectConfig(content); if (parsed.isErr()) return { ...EMPTY_PROJECT_CONFIG }; return parsed.value; } catch { return { ...EMPTY_PROJECT_CONFIG }; } } async merge(partial: Partial): Promise { const folderPath = this.#config.getProjectTaskPath(); if (!folderPath) return; const current = await this.load(); const merged: ProjectConfig = { ...current, ...partial }; const content = serializeProjectConfig(merged); await this.#fs.writeFile(getProjectConfigPath(folderPath), content); } }