xmltv_rs/
xmltv.rs

1use std::io::Write;
2
3use xml_builder::{XMLElement, XML};
4
5use crate::{Result, XMLTVChannel, XMLTVProgram};
6
7/// Root structure representing a XMLTV document.
8///
9/// Has to be feed with `XMLTVChannel` and `XMLTVProgram` elements.
10pub struct XMLTV {
11    xml: XML,
12    root_element: XMLElement,
13}
14
15impl Default for XMLTV {
16    fn default() -> Self {
17        let mut xml = XML::new();
18        xml.set_header_rendering(false);
19        xml.set_attribute_sorting(true);
20
21        // The root element is created first to be easily handled
22        let root_element = XMLElement::new("tv");
23
24        Self { xml, root_element }
25    }
26}
27
28impl XMLTV {
29    pub fn new() -> Self {
30        Self::default()
31    }
32
33    pub fn set_date(&mut self, date: String) {
34        self.root_element.add_attribute("date", &date);
35    }
36
37    pub fn add_source_info_url(&mut self, source_info_url: String) {
38        self.root_element
39            .add_attribute("source-info-url", &source_info_url);
40    }
41
42    pub fn add_source_info_name(&mut self, source_info_name: String) {
43        self.root_element
44            .add_attribute("source-info-name", &source_info_name);
45    }
46
47    pub fn add_source_data_url(&mut self, source_data_url: String) {
48        self.root_element
49            .add_attribute("source-data-url", &source_data_url);
50    }
51
52    pub fn add_generator_info_name(&mut self, generator_info_name: String) {
53        self.root_element
54            .add_attribute("generator-info-name", &generator_info_name);
55    }
56
57    pub fn add_generator_info_url(&mut self, generator_info_url: String) {
58        self.root_element
59            .add_attribute("generator-info-url", &generator_info_url);
60    }
61
62    pub fn add_channel(&mut self, channel: XMLTVChannel) -> Result<()> {
63        Ok(self.root_element.add_child(channel.to_xmlelement()?)?)
64    }
65
66    pub fn add_program(&mut self, program: XMLTVProgram) -> Result<()> {
67        Ok(self.root_element.add_child(program.to_xmlelement()?)?)
68    }
69
70    pub fn render<W: Write>(mut self, writer: &mut W) -> Result<()> {
71        self.xml.set_root_element(self.root_element);
72
73        Ok(self.xml.build(writer)?)
74    }
75
76    pub fn build<W: Write>(self, writer: &mut W) -> Result<()> {
77        self.render(writer)
78    }
79}