halbu 0.3.0

Diablo II save file parsing library.
Documentation
use crate::character::v105::CharacterCodecV105;
use crate::character::v99::CharacterCodecV99;
use crate::character::Character;
use crate::format::FormatId;
use crate::ParseHardError;

pub trait CharacterCodec {
    const CHARACTER_LENGTH: usize;

    fn decode(character_section_bytes: &[u8]) -> Result<Character, ParseHardError>;
    fn encode(character: &Character) -> Result<Vec<u8>, ParseHardError>;
}

pub fn decode_for_format(
    format_id: FormatId,
    character_section_bytes: &[u8],
) -> Result<Character, ParseHardError> {
    match format_id {
        FormatId::V99 => CharacterCodecV99::decode(character_section_bytes),
        FormatId::V105 | FormatId::Unknown(_) => {
            CharacterCodecV105::decode(character_section_bytes)
        }
    }
}

pub fn encode_for_format(
    format_id: FormatId,
    character: &Character,
) -> Result<Vec<u8>, ParseHardError> {
    match format_id {
        FormatId::V99 => CharacterCodecV99::encode(character),
        FormatId::V105 | FormatId::Unknown(_) => CharacterCodecV105::encode(character),
    }
}

pub fn expected_length_for_format(format_id: FormatId) -> usize {
    match format_id {
        FormatId::V99 => CharacterCodecV99::CHARACTER_LENGTH,
        FormatId::V105 | FormatId::Unknown(_) => CharacterCodecV105::CHARACTER_LENGTH,
    }
}