use crate::client::ApiError;
use crate::live::Subscription;
pub mod codes {
pub const INVALID_PARAM: i64 = 20_001;
pub const NOT_SUBSCRIBED: i64 = 30_002;
pub const ALREADY_SUBSCRIBED: i64 = 30_003;
pub const INVALID_CHANNEL: i64 = 30_005;
pub const BATCH_TOO_LARGE: i64 = 21_514;
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Refusal {
pub code: i64,
pub message: String,
pub id: Option<String>,
}
impl Refusal {
#[must_use]
pub fn channel(&self) -> Option<&str> {
let (_, last) = self.message.rsplit_once(": ")?;
let last = last.trim();
let plain = !last.is_empty()
&& last
.bytes()
.all(|byte| byte.is_ascii_lowercase() || byte.is_ascii_digit() || matches!(byte, b'_' | b':'));
plain.then_some(last)
}
#[must_use]
pub fn subscription(&self) -> Option<Subscription> {
Subscription::parse(self.channel()?).ok()
}
#[must_use]
pub fn to_api_error(&self) -> ApiError {
ApiError::Refused { code: self.code, message: self.message.clone() }
}
}
#[cfg(test)]
#[path = "tests/control.rs"]
mod tests;