1use thiserror::Error;
7
8#[derive(Debug, Error)]
10pub enum StalkerError {
11 #[error("portal not found at any known path for base URL: {0}")]
13 PortalNotFound(String),
14
15 #[error("handshake failed: {0}")]
17 HandshakeFailed(String),
18
19 #[error("authentication failed: {0}")]
21 Auth(String),
22
23 #[error("session expired")]
25 SessionExpired,
26
27 #[error("unexpected response: {0}")]
29 UnexpectedResponse(String),
30
31 #[error("network error: {0}")]
33 Network(#[from] reqwest::Error),
34
35 #[error("invalid URL: {0}")]
37 InvalidUrl(#[from] url::ParseError),
38
39 #[error("JSON parse error: {0}")]
41 Json(#[from] serde_json::Error),
42
43 #[error("not authenticated — call authenticate() first")]
45 NotAuthenticated,
46}
47
48impl From<&StalkerError> for crispy_iptv_types::IptvError {
49 fn from(e: &StalkerError) -> Self {
50 match e {
51 StalkerError::Auth(msg) => crispy_iptv_types::IptvError::Auth(msg.clone()),
52 StalkerError::SessionExpired => {
53 crispy_iptv_types::IptvError::SessionExpired("stalker session expired".into())
54 }
55 StalkerError::Network(e) => crispy_iptv_types::IptvError::Network(e.to_string()),
56 StalkerError::InvalidUrl(e) => crispy_iptv_types::IptvError::InvalidUrl(e.to_string()),
57 other => crispy_iptv_types::IptvError::UnexpectedResponse(other.to_string()),
58 }
59 }
60}