# 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)
}
```