15 lines
1.0 KiB
TypeScript
15 lines
1.0 KiB
TypeScript
import { parseProject } from '../src/core/project';
|
|
import type { Sample } from './sample-explorer';
|
|
const resources=new Map<string,Promise<{text:string;project:ReturnType<typeof parseProject>}>>();
|
|
/** One immutable resource per sample URL, shared by preview and existing app-file loader. */
|
|
export function sampleResource(sample:Pick<Sample,'url'|'bridge'|'pierCount'>){
|
|
if(!resources.has(sample.url))resources.set(sample.url,(async()=>{
|
|
const response=await fetch(sample.url);if(!response.ok)throw new Error(`샘플 파일 읽기 실패: HTTP ${response.status}`);
|
|
const text=await response.text(),project=parseProject(text);
|
|
if(project.project.bridge!==sample.bridge)throw new Error(`교량 ID 불일치: 선택 ${sample.bridge} / 파일 ${project.project.bridge}`);
|
|
if(project.piers.length!==sample.pierCount)throw new Error(`교각 수 불일치: 목록 ${sample.pierCount} / 파일 ${project.piers.length}`);
|
|
return {text,project};
|
|
})().catch(error=>{resources.delete(sample.url);throw error;}));
|
|
return resources.get(sample.url)!;
|
|
}
|