wit_encoder/
use_.rs
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 Use {
10 target: Ident,
11 use_names_list: Vec<(Ident, Option<Ident>)>,
12}
13
14impl Use {
15 pub fn new(use_target: impl Into<Ident>) -> Self {
16 Self {
17 target: use_target.into(),
18 use_names_list: vec![],
19 }
20 }
21
22 pub fn target(&self) -> &Ident {
23 &self.target
24 }
25
26 pub fn set_target(&mut self, target: Ident) {
27 self.target = target;
28 }
29
30 pub fn item(&mut self, id: impl Into<Ident>, alias: Option<Ident>) {
32 self.use_names_list
33 .push((id.into(), alias.map(|s| s.into())));
34 }
35
36 pub fn use_names_list(&self) -> &[(Ident, Option<Ident>)] {
37 &self.use_names_list
38 }
39
40 pub fn use_names_list_mut(&mut self) -> &mut Vec<(Ident, Option<Ident>)> {
41 &mut self.use_names_list
42 }
43}
44
45impl Render for Use {
46 fn render(&self, f: &mut fmt::Formatter<'_>, opts: &crate::RenderOpts) -> fmt::Result {
47 let len = self.use_names_list.len();
48
49 write!(f, "{}use {}.{{ ", opts.spaces(), self.target)?;
50 for (i, (id, alias)) in self.use_names_list.iter().enumerate() {
51 if let Some(alias) = alias {
52 write!(f, "{id} as {alias}")?;
53 } else {
54 write!(f, "{id}")?;
55 }
56 if i < len - 1 {
57 write!(f, ", ")?;
58 }
59 }
60 write!(f, " }};\n")?;
61 Ok(())
62 }
63}