terra_plr/player/
error.rs1use crate::{player::MAGIC_NUMBER, TerrariaFileType, SUPPORTED_VERSIONS};
2use cs_datetime_parse::{OutOfRangeError, ParseError};
3use std::io;
4use thiserror::Error;
5
6pub type Result<T> = core::result::Result<T, Error>;
7
8fn format_u8_array(array: &[u8]) -> String {
9 let mut text = String::with_capacity(array.len());
10 for byte in array {
11 if !byte.is_ascii_graphic() {
12 text.push_str("\\x");
13 text.push_str(&byte.to_string());
14 continue;
15 }
16
17 let char = *byte as char;
18 if char == '\\' {
19 text.push_str("\\\\");
20 continue;
21 }
22
23 text.push(char);
24 }
25
26 text
27}
28
29#[derive(Debug, Error)]
30pub enum Error {
31 #[error("the version {0} is not supported, supported versions: {SUPPORTED_VERSIONS:?}")]
32 UnsupportedVersion(i32),
33
34 #[error("invalid magic number expected b\"{}\", found b\"{}\"", format_u8_array(MAGIC_NUMBER), format_u8_array(.0))]
35 InvalidMagicNumber([u8; 7]),
36
37 #[error("invalid file type expected {}, found {}", TerrariaFileType::Player.name(), .0.name())]
38 InvalidFileType(TerrariaFileType),
39
40 #[error("io error")]
41 Io(#[from] io::Error),
42
43 #[error("{0}")]
44 DateTimeCsOutOfRange(#[from] OutOfRangeError),
45
46 #[error("{0}")]
47 DateTimeParse(#[from] ParseError),
48}