implements PR-016 asset codec NONE in runtime
This commit is contained in:
parent
a024e199fb
commit
ecc1a864bb
@ -180,6 +180,10 @@ impl AssetBridge for AssetManager {
|
||||
}
|
||||
|
||||
impl AssetManager {
|
||||
fn codec_is_none_or_legacy_raw(codec: &str) -> bool {
|
||||
matches!(codec, "NONE" | "RAW")
|
||||
}
|
||||
|
||||
fn decode_tile_bank_layout(
|
||||
entry: &AssetEntry,
|
||||
) -> Result<(TileSize, usize, usize, usize), String> {
|
||||
@ -246,9 +250,13 @@ impl AssetManager {
|
||||
}
|
||||
|
||||
fn op_mode_for(entry: &AssetEntry) -> Result<AssetOpMode, String> {
|
||||
match (entry.bank_type, entry.codec.as_str()) {
|
||||
(BankType::TILES, "RAW") => Ok(AssetOpMode::StageInMemory),
|
||||
(BankType::SOUNDS, "RAW") => Ok(AssetOpMode::DirectFromSlice),
|
||||
match entry.bank_type {
|
||||
BankType::TILES if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
|
||||
Ok(AssetOpMode::StageInMemory)
|
||||
}
|
||||
BankType::SOUNDS if Self::codec_is_none_or_legacy_raw(entry.codec.as_str()) => {
|
||||
Ok(AssetOpMode::DirectFromSlice)
|
||||
}
|
||||
_ => Err(format!("Unsupported codec: {}", entry.codec)),
|
||||
}
|
||||
}
|
||||
@ -914,7 +922,7 @@ mod tests {
|
||||
offset: 0,
|
||||
size: expected_tile_payload_size(width, height) as u64,
|
||||
decoded_size: expected_tile_decoded_size(width, height) as u64,
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: serde_json::json!({
|
||||
"tile_size": 16,
|
||||
"width": width,
|
||||
@ -966,14 +974,22 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_op_mode_for_tiles_raw_stages_in_memory() {
|
||||
fn test_op_mode_for_tiles_none_stages_in_memory() {
|
||||
let entry = test_tile_asset_entry("tiles", 16, 16);
|
||||
|
||||
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_op_mode_for_sounds_raw_reads_direct_from_slice() {
|
||||
fn test_op_mode_for_tiles_raw_is_legacy_alias() {
|
||||
let mut entry = test_tile_asset_entry("tiles", 16, 16);
|
||||
entry.codec = "RAW".to_string();
|
||||
|
||||
assert_eq!(AssetManager::op_mode_for(&entry), Ok(AssetOpMode::StageInMemory));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_op_mode_for_sounds_none_reads_direct_from_slice() {
|
||||
let entry = AssetEntry {
|
||||
asset_id: 1,
|
||||
asset_name: "sound".to_string(),
|
||||
@ -981,7 +997,7 @@ mod tests {
|
||||
offset: 0,
|
||||
size: 8,
|
||||
decoded_size: 8,
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: serde_json::json!({
|
||||
"sample_rate": 44100
|
||||
}),
|
||||
@ -1077,7 +1093,7 @@ mod tests {
|
||||
offset: 0,
|
||||
size: data.len() as u64,
|
||||
decoded_size: data.len() as u64,
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: serde_json::json!({
|
||||
"sample_rate": 44100
|
||||
}),
|
||||
@ -1122,7 +1138,7 @@ mod tests {
|
||||
offset: 0,
|
||||
size: data.len() as u64,
|
||||
decoded_size: data.len() as u64,
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: serde_json::json!({
|
||||
"sample_rate": 44100
|
||||
}),
|
||||
|
||||
@ -20,7 +20,7 @@ pub struct AssetEntry {
|
||||
pub offset: u64,
|
||||
pub size: u64,
|
||||
pub decoded_size: u64,
|
||||
pub codec: String, // e.g., "RAW"
|
||||
pub codec: String, // e.g., "NONE" (legacy alias: "RAW")
|
||||
pub metadata: serde_json::Value,
|
||||
}
|
||||
|
||||
|
||||
@ -369,7 +369,7 @@ mod tests {
|
||||
offset,
|
||||
size,
|
||||
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: json!({
|
||||
"tile_size": 16,
|
||||
"width": 16,
|
||||
@ -451,7 +451,7 @@ mod tests {
|
||||
offset: 4,
|
||||
size: 4,
|
||||
decoded_size: 16 * 16 + (TILE_BANK_PALETTE_COUNT_V1 as u64 * 16 * 2),
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: json!({
|
||||
"tile_size": 16,
|
||||
"width": 16,
|
||||
|
||||
@ -109,7 +109,7 @@ fn test_tile_asset_entry(asset_name: &str, data_len: usize) -> AssetEntry {
|
||||
offset: 0,
|
||||
size: data_len as u64,
|
||||
decoded_size: test_tile_decoded_size(16, 16) as u64,
|
||||
codec: "RAW".to_string(),
|
||||
codec: "NONE".to_string(),
|
||||
metadata: serde_json::json!({
|
||||
"tile_size": 16,
|
||||
"width": 16,
|
||||
|
||||
@ -1,61 +0,0 @@
|
||||
# 016 Asset Codec `NONE` Runtime and Tests
|
||||
|
||||
## Briefing
|
||||
|
||||
Com a decision `013`, o runtime deve migrar o valor canonico de `codec` para `NONE` sem quebrar a transicao curta a partir de `RAW`.
|
||||
|
||||
Esta PR executa a propagacao em codigo, fixtures e testes do runtime.
|
||||
|
||||
## Decisions de Origem
|
||||
|
||||
- `docs/runtime/decisions/013-asset-codec-none-vs-raw.md`
|
||||
|
||||
## Alvo
|
||||
|
||||
Atualizar o runtime para que:
|
||||
|
||||
1. `NONE` seja aceito como valor principal de `codec`;
|
||||
2. `RAW` seja aceito apenas como alias legado durante a janela curta de transicao;
|
||||
3. fixtures e testes passem a publicar `NONE` como valor canonico;
|
||||
4. `TILES` e `SOUNDS` fiquem coerentes com a decision.
|
||||
|
||||
## Escopo
|
||||
|
||||
- atualizar `crates/console/prometeu-drivers/src/asset.rs`
|
||||
- atualizar fixtures/testes em `prometeu-drivers`, `prometeu-hal` e `prometeu-system`
|
||||
- ajustar comentarios inline onde `RAW` ainda apareca como valor canonico
|
||||
|
||||
## Fora de Escopo
|
||||
|
||||
- remover imediatamente a compatibilidade com `RAW`
|
||||
- alterar packer
|
||||
- introduzir novos codecs
|
||||
- mudar contratos de layout de `TILES` ou `SOUNDS`
|
||||
- publicar banks genericos novos como `BLOB`
|
||||
|
||||
## Plano de Execucao
|
||||
|
||||
1. Atualizar o path de resolucao de `codec` para aceitar `NONE` como valor canonico.
|
||||
2. Preservar `RAW` como alias legado durante a transicao curta.
|
||||
3. Migrar fixtures e testes para emitir `NONE`.
|
||||
4. Revisar comentarios e exemplos inline para remover `RAW` como default canonico.
|
||||
5. Validar que `TILES` e `SOUNDS` continuam operando sem regressao comportamental.
|
||||
|
||||
## Criterios de Aceite
|
||||
|
||||
- runtime aceita `NONE` em `TILES` e `SOUNDS`
|
||||
- runtime continua aceitando `RAW` apenas como alias legado
|
||||
- fixtures e testes passam a usar `NONE` como valor canonico
|
||||
- nenhum comentario ou helper novo reforca `RAW` como valor principal
|
||||
|
||||
## Tests / Validacao
|
||||
|
||||
- testes unitarios do asset loader
|
||||
- testes do runtime/VM que passam por asset loading
|
||||
- revisao de fixtures de cartridge/asset metadata
|
||||
|
||||
## Riscos
|
||||
|
||||
- deixar paths diferentes tratando `NONE` e `RAW` de forma inconsistente
|
||||
- migrar fixtures parcialmente e mascarar regressao real
|
||||
- prolongar compatibilidade legacy sem rastro claro para remocao futura
|
||||
@ -36,7 +36,7 @@ Uma PR deste diretório deve:
|
||||
|
||||
## Roadmap Atual
|
||||
|
||||
- `016-asset-codec-none-runtime-and-tests.md`
|
||||
Nenhuma PR em aberto no momento.
|
||||
|
||||
## PRs Finalizadas
|
||||
|
||||
@ -44,3 +44,4 @@ Uma PR deste diretório deve:
|
||||
- `013-tile-bank-runtime-contract-alignment.md`: concluída. Contrato normativo de `tile bank` v1 alinhado entre `specs/04` e `specs/15`.
|
||||
- `014-tile-bank-loader-packed-nibbles-and-palette-boundary.md`: concluída. Loader/runtime atualizado para consumir payload serializado `4bpp` packed com `64` paletas por bank.
|
||||
- `015-asset-codec-none-canonicalization-in-specs.md`: concluída. `NONE` publicado como valor canonico de ausencia de codec adicional nas specs.
|
||||
- `016-asset-codec-none-runtime-and-tests.md`: concluída. Runtime e fixtures migrados para `NONE`, preservando `RAW` apenas como alias legado temporário.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user