/
web-master
/
IPTV-Aggregator
Обзор
Документация
Войти
/
web-master
/
IPTV-Aggregator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/types.rs
77 строк
2 KB
web-master
Первый коммит
28 фев 2026, 18:57
28 фев 2026, 18:57
d6f0f0c
Код
Авторство
О чём код?
//! Типы данных приложения use serde::{Deserialize, Serialize}; use std::collections::HashMap; /// IPTV канал #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct Channel { /// Название канала pub name: String, /// URL потока pub url: String, /// Группа канала pub group: String, /// URL логотипа (опционально) pub logo: Option<String>, /// Статус: работает ли канал pub is_alive: bool, } #[allow(dead_code)] impl Channel { /// Создает новый канал pub fn new(name: String, url: String, group: String) -> Self { Self { name, url, group, logo: None, is_alive: true, } } /// Создает новый канал с логотипом pub fn with_logo(mut self, logo: String) -> Self { self.logo = Some(logo); self } /// Проверяет, является ли канал HLS потоком pub fn is_hls(&self) -> bool { self.url.ends_with(".m3u8") || self.url.contains(".m3u8?") } } /// Карта каналов, сгруппированных по категорияям pub type ChannelMap = HashMap<String, Vec<Channel>>; /// Расширения для ChannelMap #[allow(dead_code)] pub trait ChannelMapExt { /// Общее количество каналов fn total_channels(&self) -> usize; /// Количество рабочих каналов fn alive_channels(&self) -> usize; /// Получить все каналы (плоский список) fn all_channels(&self) -> Vec<&Channel>; } impl ChannelMapExt for ChannelMap { fn total_channels(&self) -> usize { self.values().map(|v| v.len()).sum() } fn alive_channels(&self) -> usize { self.values() .flat_map(|v| v.iter()) .filter(|ch| ch.is_alive) .count() } fn all_channels(&self) -> Vec<&Channel> { self.values().flat_map(|v| v.iter()).collect() } }