Skip to main content

terra_plr/player/
error.rs

1use 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}