use pest::error::Error as PestError;
use std::{io, num};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum VmfError {
#[error("IO error: {0}")]
Io(#[from] io::Error),
#[error("VMF parse error: {0}")]
Parse(#[from] Box<PestError<crate::parser::Rule>>),
#[error("Invalid VMF format: {0}")]
InvalidFormat(String),
#[error("Integer parse error for key '{key}': {source}")]
ParseInt {
key: String,
#[source]
source: num::ParseIntError,
},
#[error("Float parse error for key '{key}': {source}")]
ParseFloat {
key: String,
#[source]
source: num::ParseFloatError,
},
}
pub type VmfResult<T> = Result<T, VmfError>;
impl From<(std::num::ParseIntError, String)> for VmfError {
fn from(err: (std::num::ParseIntError, String)) -> Self {
VmfError::ParseInt {
source: err.0,
key: err.1,
}
}
}
impl From<(std::num::ParseFloatError, String)> for VmfError {
fn from(err: (std::num::ParseFloatError, String)) -> Self {
VmfError::ParseFloat {
source: err.0,
key: err.1,
}
}
}