use thiserror::Error;
#[derive(Debug, Error)]
pub enum StalkerError {
#[error("portal not found at any known path for base URL: {0}")]
PortalNotFound(String),
#[error("handshake failed: {0}")]
HandshakeFailed(String),
#[error("authentication failed: {0}")]
Auth(String),
#[error("session expired")]
SessionExpired,
#[error("unexpected response: {0}")]
UnexpectedResponse(String),
#[error("network error: {0}")]
Network(#[from] reqwest::Error),
#[error("invalid URL: {0}")]
InvalidUrl(#[from] url::ParseError),
#[error("JSON parse error: {0}")]
Json(#[from] serde_json::Error),
#[error("not authenticated — call authenticate() first")]
NotAuthenticated,
}
impl From<&StalkerError> for crispy_iptv_types::IptvError {
fn from(e: &StalkerError) -> Self {
match e {
StalkerError::Auth(msg) => crispy_iptv_types::IptvError::Auth(msg.clone()),
StalkerError::SessionExpired => {
crispy_iptv_types::IptvError::SessionExpired("stalker session expired".into())
}
StalkerError::Network(e) => crispy_iptv_types::IptvError::Network(e.to_string()),
StalkerError::InvalidUrl(e) => crispy_iptv_types::IptvError::InvalidUrl(e.to_string()),
other => crispy_iptv_types::IptvError::UnexpectedResponse(other.to_string()),
}
}
}