# Manifest Module

YAML 매니페스트 파일을 안전하고 효율적으로 관리하는 모듈입니다. 게임 설정, 엔티티 템플릿, 씬 구성 등을 선언적으로 정의할 수 있습니다.

## 모듈 구조

- `structure.rs` - 매니페스트 타입 정의 (EntityManifest, SceneManifest 등)
- `loader.rs` - YAML 파일 로딩 및 파싱 로직

## 주요 구성 요소

### 매니페스트 타입

#### EntityManifest
엔티티 템플릿을 정의하는 매니페스트입니다.
```rust
pub struct EntityManifest {
    pub components: HashMap<String, Value>,
}
```

#### SceneManifest
씬 구성을 정의하는 매니페스트입니다.
```rust
pub struct SceneManifest {
    pub entities: HashMap<String, EntityInstance>,
}

pub struct EntityInstance {
    pub template: Option<String>,
    pub components: HashMap<String, Value>,
}
```

#### ScenarioManifest
게임 시나리오와 씬 전환을 정의하는 매니페스트입니다.
```rust
pub struct ScenarioManifest {
    pub scenario: Scenario,
}
```

### 로더 시스템

#### 범용 로더 함수
모든 매니페스트 타입에 대한 통합 로딩 함수를 제공합니다.
```rust
pub fn load_manifest<T, P>(path: P) -> Result<T, ManifestLoaderError>
where
    T: for<'de> Deserialize<'de>,
    P: AsRef<Path>,
```

#### 전용 로더 함수들
각 매니페스트 타입별로 최적화된 로더를 제공합니다.
```rust
pub fn load_entity_manifest<P: AsRef<Path>>(path: P) -> Result<EntityManifest, ManifestLoaderError>
pub fn load_scene_manifest<P: AsRef<Path>>(path: P) -> Result<SceneManifest, ManifestLoaderError>
pub fn load_scenario_manifest<P: AsRef<Path>>(path: P) -> Result<ScenarioManifest, ManifestLoaderError>
```

## 에러 처리

### ManifestLoaderError
매니페스트 로딩 중 발생할 수 있는 에러들을 분류합니다.
```rust
pub enum ManifestLoaderError {
    Io(std::io::Error),     // 파일 접근, 권한, 존재하지 않는 파일 등
    Yaml(serde_yaml::Error), // YAML 구문 오류, 타입 불일치 등
}
```

## 사용법

### 기본 사용
```rust
use crate::manifest::*;

// 엔티티 템플릿 로드
let player_template = load_entity_manifest("world/entities/player.yaml")?;

// 씬 구성 로드
let main_scene = load_scene_manifest("world/scenes/main_menu.yaml")?;

// 시나리오 로드
let tutorial = load_scenario_manifest("world/scenarios/tutorial.yaml")?;
```

### 범용 로더 사용
```rust
// 타입을 명시적으로 지정
let manifest: EntityManifest = load_manifest("world/entities/enemy.yaml")?;

// 또는 컨텍스트에서 타입 추론
let scene_data = load_manifest::<SceneManifest, _>("world/scenes/level1.yaml")?;
```

## YAML 파일 예시

### Entity Template (world/entities/player.yaml)
```yaml
components:
  Transform:
    x: 0.0
    y: 0.0
    rotation: 0.0
    scale_x: 1.0
    scale_y: 1.0
  Sprite:
    texture_path: "textures/player.png"
    width: 64.0
    height: 64.0
    color: [1.0, 1.0, 1.0, 1.0]
```

### Scene Configuration (world/scenes/main_menu.yaml)
```yaml
entities:
  background:
    template: "environment/static_background"
  title_text:
    template: "ui/text_label"
    components:
      Text:
        content: "Game Title"
        font_size: 48.0
```

### Scenario Definition (world/scenarios/tutorial.yaml)
```yaml
scenario:
  entry_scene: "main_menu"
  defaults:
    requirements:
      network: "none"
      access: "local"
  scenes:
    - name: "main_menu"
    - name: "tutorial_level1"
      requirements:
        access: "tutorial"
```

## 특징

### 타입 안전성
- 컴파일 타임 타입 검증으로 런타임 에러 방지
- Serde를 활용한 자동 직렬화/역직렬화

### 유연한 경로 지원
- `&str`, `String`, `PathBuf` 등 다양한 경로 타입 지원
- 상대/절대 경로 모두 지원

### 명확한 에러 분류
- IO 에러와 YAML 파싱 에러 구분
- 디버깅과 에러 처리 최적화

## 모듈 구조

- `structure.rs` - 매니페스트 데이터 구조체 정의
- `loader.rs` - 파일 로딩 및 파싱 로직
- `mod.rs` - 통합 API 제공 및 모듈 관리

## 확장성

새로운 매니페스트 타입을 추가하려면:

1. `structure.rs`에 구조체 정의
2. `Deserialize` trait 구현
3. `loader.rs`에 전용 로더 함수 추가 (선택사항)

```rust
#[derive(Debug, Deserialize)]
pub struct CustomManifest {
    pub custom_field: String,
}

pub fn load_custom_manifest<P: AsRef<Path>>(path: P) -> Result<CustomManifest, ManifestLoaderError> {
    load_manifest(path)
}
```