use serde_llsd_benthic::LLSDValue;
use std::{array::TryFromSliceError, str::Utf8Error, string::FromUtf8Error};
use thiserror::Error;
use crate::messages::ui::login_error::{LoginError, Reason};
#[derive(Debug, Error)]
pub enum ParseError {
#[error("Parse Error: {0}")]
Message(String),
#[error("Missing field: {0}")]
MissingField(String),
#[error("Invalid field:: {0}")]
InvalidField(String),
#[error("Failed to generate mesh: {0}")]
MeshError(String),
#[error("Failed to deserialize Serde-LLSD map")]
LLSDError(),
#[error("Serde deserialze failed")]
SerdeError(#[from] serde_json::Error),
#[error("Failed to decode slice")]
SliceError(#[from] TryFromSliceError),
#[error("Parse Error: {0}")]
IOError(#[from] std::io::Error),
#[error("Utf8Error: {0}")]
Utf8Error(#[from] Utf8Error),
#[error("Anyhow Error: {0}")]
Anyhow(#[from] anyhow::Error),
#[error("UUID parse error: {0}")]
UuidError(#[from] uuid::Error),
#[error("ParseInt error: {0}")]
ParseInt(#[from] std::num::ParseIntError),
#[error("Failed to parse bool: {0}")]
ParseBool(#[from] std::str::ParseBoolError),
#[error("Failed to parse float: {0}")]
ParseFloat(#[from] std::num::ParseFloatError),
#[error("UTF8 error: {0}")]
UTF8Error(#[from] FromUtf8Error),
}
impl From<ParseError> for LoginError {
fn from(e: ParseError) -> Self {
LoginError {
reason: Reason::ParseError,
message: e.to_string(),
}
}
}
impl From<LLSDValue> for ParseError {
fn from(value: LLSDValue) -> Self {
ParseError::InvalidField(format!("{value:?}"))
}
}