fn decode_strings>()

in src/model/filerec.rs [96:137]


fn decode_strings<'a>(data: &[u8]) -> Result<Vec<String>, StringDecodeError<'a>> {
	let mut result: Vec<String> = Vec::with_capacity(10);
	let mut slice = data.clone();

	loop {
		let reader: &mut dyn Read = &mut slice.clone();
		let byte_result = reader
			.read_u8()
			.map_err(|_| StringDecodeError("Failed to parse file rec string header"))?;

		match byte_result {
			0x00..=0xfc => panic!("What 0x{:x}", byte_result),
			0xfd => panic!("What 0x{:x}", byte_result),
			0xfe => {
				let size = reader
					.read_i32::<LittleEndian>()
					.map_err(|_| StringDecodeError("Failed to parse file rec string size"))?;

				let size = -size as usize;

				if size > 0 {
					assert_eq!(size % 2, 0);

					let mut u16data: Vec<u16> = vec![0; size / 2];
					LittleEndian::read_u16_into(&slice[5..5 + size], &mut u16data);

					let string = String::from_utf16(&u16data)
						.map_err(|_| StringDecodeError("Failed to parse file rec data string"))?;
					result.push(string);
				}

				slice = &slice[5 + size..];
			}
			0xff => {
				if slice.len() != 1 {
					return Err(StringDecodeError("Invalid file rec string header length"));
				}
				return Ok(result);
			}
		}
	}
}