1use std::fmt;
2
3use crate::{Ident, Render};
4
5#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
9pub struct Include {
10 use_path: Ident,
11 include_names_list: Vec<(String, String)>,
12}
13
14impl Include {
15 pub fn new(use_path: impl Into<Ident>) -> Self {
16 Self {
17 use_path: use_path.into(),
18 include_names_list: vec![],
19 }
20 }
21
22 pub fn use_path(&self) -> &Ident {
23 &self.use_path
24 }
25
26 pub fn set_use_path(&mut self, use_path: impl Into<Ident>) {
27 self.use_path = use_path.into();
28 }
29
30 pub fn include_names_list(&self) -> &[(String, String)] {
31 &self.include_names_list
32 }
33
34 pub fn include_names_list_mut(&mut self) -> &mut Vec<(String, String)> {
35 &mut self.include_names_list
36 }
37
38 pub fn with(&mut self, id: &str, alias: &str) {
39 self.include_names_list
40 .push((id.to_string(), alias.to_string()));
41 }
42}
43
44impl Render for Include {
45 fn render(&self, f: &mut fmt::Formatter<'_>, opts: &crate::RenderOpts) -> fmt::Result {
46 match self.include_names_list.len() {
47 0 => write!(f, "{}include {};\n", opts.spaces(), self.use_path)?,
48 len => {
49 write!(f, "{}include {} with {{ ", opts.spaces(), self.use_path)?;
50 for (i, (id, alias)) in self.include_names_list.iter().enumerate() {
51 if i == len - 1 {
52 write!(f, "{id} as {alias}")?;
53 } else {
54 write!(f, "{id} as {alias}, ")?;
55 }
56 }
57 write!(f, " }};\n")?;
58 }
59 }
60 Ok(())
61 }
62}