zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use serde::ser::SerializeMap;
use serde::{Serialize, Serializer};

use rustube::{Stream, VideoInfo};

use crate::core::youtube::args::output_level::OutputLevel;
use crate::core::youtube::stream_serializer::StreamSerializer;

#[derive(Debug)]
pub struct VideoSerializer {
    output_level: OutputLevel,
    video_info: VideoInfo,
    streams: Vec<StreamSerializer>,
}

impl VideoSerializer {
    pub fn new(
        video_info: VideoInfo,
        streams: impl Iterator<Item = Stream>,
        output_level: OutputLevel,
    ) -> Self {
        let streams = streams
            .map(|stream| StreamSerializer {
                stream,
                output_level: output_level.clone(),
            })
            .collect::<Vec<_>>();

        Self {
            output_level,
            video_info,
            streams,
        }
    }
}

impl Serialize for VideoSerializer {
    fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
    where
        S: Serializer,
    {
        let mut map = serializer.serialize_map(None)?;

        if self.output_level.contains(OutputLevel::VIDEO) {
            map.serialize_entry("video_info", &self.video_info)?;
        }
        map.serialize_entry("streams", &self.streams)?;

        map.end()
    }
}