use serde::{Deserialize, Serialize};
use serde_llsd_benthic::converter::get;
use serde_llsd_benthic::LLSDValue;
use thiserror::Error;
use crate::errors::ParseError;
#[derive(Debug, Error)]
#[error("Conversion failed: {0}")]
pub struct ConversionError(pub &'static str);
#[derive(Debug, Clone, Serialize, Deserialize, Error)]
#[error("{message}")]
pub struct LoginError {
pub reason: Reason,
pub message: String,
}
impl From<ParseError> for LoginError {
fn from(e: ParseError) -> Self {
LoginError {
reason: Reason::ParseError,
message: e.to_string(),
}
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq)]
pub enum Reason {
Presence,
Key,
Connection,
Unknown,
ParseError,
}
impl LoginError {
pub fn from_llsd(value: &LLSDValue) -> Self {
match value {
LLSDValue::Map(map) => {
let reason: String = get("reason", map);
let message: String = get("message", map);
match reason.as_str() {
"presence" => LoginError {
reason: Reason::Presence,
message,
},
"key" => LoginError {
reason: Reason::Key,
message,
},
"connection" => LoginError {
reason: Reason::Connection,
message,
},
_ => LoginError {
reason: Reason::Unknown,
message,
},
}
}
_ => LoginError {
reason: Reason::Unknown,
message: "Conversion failed".into(),
},
}
}
}