1use std::io::Write;
2
3use xml_builder::{XMLElement, XML};
4
5use crate::{Result, XMLTVChannel, XMLTVProgram};
6
7pub 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 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}