use crate::IcecastStatsSource;
use serde::{Deserialize, Serialize};
#[cfg(feature = "chrono")]
use crate::parser::parse_datetime;
#[cfg(feature = "chrono")]
use chrono::{DateTime, FixedOffset};
#[derive(Serialize, Deserialize, Debug)]
pub struct IcecastStatsRoot {
pub icestats: IcecastStats,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct IcecastStats {
admin: String,
#[serde(rename = "banned_IPs")]
banned_ips: Option<u32>,
client_connections: Option<u32>,
clients: Option<u32>,
connections: Option<u32>,
file_connections: Option<u32>,
host: String,
listener_connections: Option<u32>,
listeners: Option<u32>,
location: String,
server_id: String,
source_client_connections: Option<u32>,
source_relay_connections: Option<u32>,
source_total_connections: Option<u32>,
sources: Option<u32>,
stats: Option<u32>,
stats_connections: Option<u32>,
server_start: Option<String>,
server_start_iso8601: Option<String>,
source: Option<IcecastStatsSourceEnum>,
}
impl IcecastStats {
pub fn admin(&self) -> &String {
&self.admin
}
pub fn client_connections(&self) -> &Option<u32> {
&self.client_connections
}
pub fn clients(&self) -> &Option<u32> {
&self.clients
}
pub fn connections(&self) -> &Option<u32> {
&self.connections
}
pub fn file_connections(&self) -> &Option<u32> {
&self.file_connections
}
pub fn host(&self) -> &String {
&self.host
}
pub fn listener_connections(&self) -> &Option<u32> {
&self.listener_connections
}
pub fn listeners(&self) -> &Option<u32> {
&self.listeners
}
pub fn location(&self) -> &String {
&self.location
}
pub fn server_id(&self) -> &String {
&self.server_id
}
pub fn source_client_connections(&self) -> &Option<u32> {
&self.source_client_connections
}
pub fn source_relay_connections(&self) -> &Option<u32> {
&self.source_relay_connections
}
pub fn source_total_connections(&self) -> &Option<u32> {
&self.source_total_connections
}
pub fn sources(&self) -> &Option<u32> {
&self.sources
}
pub fn stats(&self) -> &Option<u32> {
&self.stats
}
pub fn stats_connections(&self) -> &Option<u32> {
&self.stats_connections
}
pub fn server_start(&self) -> Option<&String> {
if self.server_start_iso8601.is_some() {
return self.server_start_iso8601.as_ref();
}
self.server_start.as_ref()
}
#[cfg(feature = "chrono")]
pub fn server_start_decoded(
&self,
) -> Option<Result<DateTime<FixedOffset>, chrono::ParseError>> {
self.server_start().clone().map(|x| parse_datetime(&x))
}
pub fn sources_vec(&self) -> Vec<IcecastStatsSource> {
match &self.source {
Some(source_enum) => match source_enum {
IcecastStatsSourceEnum::Single(icecast_stats_source) => {
vec![icecast_stats_source.clone()]
}
IcecastStatsSourceEnum::Multiple(list) => list.clone(),
},
None => vec![],
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum IcecastStatsSourceEnum {
Single(IcecastStatsSource),
Multiple(Vec<IcecastStatsSource>),
}