virtue_next/generate/
generate_mod.rs1use super::GenEnum;
2use super::GenStruct;
3use super::Impl;
4use super::Parent;
5use super::StreamBuilder;
6use crate::Result;
7use crate::parse::Visibility;
8use crate::prelude::Delimiter;
9use crate::prelude::Ident;
10use crate::prelude::Span;
11
12pub struct GenerateMod<'a, P: Parent> {
14 parent: &'a mut P,
15 name: Ident,
16 uses: Vec<StreamBuilder>,
17 vis: Visibility,
18 content: StreamBuilder,
19}
20
21impl<'a, P: Parent> GenerateMod<'a, P> {
22 pub(crate) fn new(
23 parent: &'a mut P,
24 name: impl Into<String>,
25 ) -> Self {
26 Self {
27 parent,
28 name: Ident::new(name.into().as_str(), Span::call_site()),
29 uses: Vec::new(),
30 vis: Visibility::Default,
31 content: StreamBuilder::new(),
32 }
33 }
34
35 pub fn add_use(
51 &mut self,
52 r#use: impl AsRef<str>,
53 ) -> Result {
54 let mut builder = StreamBuilder::new();
55 builder.ident_str("use").push_parsed(r#use)?.punct(';');
56 self.uses.push(builder);
57 Ok(())
58 }
59
60 pub fn generate_struct(
62 &mut self,
63 name: impl Into<String>,
64 ) -> GenStruct<'_, Self> {
65 GenStruct::new(self, name)
66 }
67
68 pub fn generate_enum(
70 &mut self,
71 name: impl Into<String>,
72 ) -> GenEnum<'_, Self> {
73 GenEnum::new(self, name)
74 }
75
76 pub fn r#impl(
78 &mut self,
79 name: impl Into<String>,
80 ) -> Impl<'_, Self> {
81 Impl::new(self, name)
82 }
83
84 pub fn generate_impl(
94 &mut self,
95 name: impl Into<String>,
96 ) -> Impl<'_, Self> {
97 Impl::new(self, name)
98 }
99}
100
101impl<P: Parent> Drop for GenerateMod<'_, P> {
102 fn drop(&mut self) {
103 let mut builder = StreamBuilder::new();
104 if self.vis == Visibility::Pub {
105 builder.ident_str("pub");
106 }
107 builder
108 .ident_str("mod")
109 .ident(self.name.clone())
110 .group(Delimiter::Brace, |group| {
111 for r#use in std::mem::take(&mut self.uses) {
112 group.append(r#use);
113 }
114 group.append(std::mem::take(&mut self.content));
115 Ok(())
116 })
117 .unwrap();
118
119 self.parent.append(builder);
120 }
121}
122
123impl<P: Parent> Parent for GenerateMod<'_, P> {
124 fn append(
125 &mut self,
126 builder: StreamBuilder,
127 ) {
128 self.content.append(builder);
129 }
130
131 fn name(&self) -> &crate::prelude::Ident {
132 &self.name
133 }
134
135 fn generics(&self) -> Option<&crate::parse::Generics> {
136 None
137 }
138
139 fn generic_constraints(&self) -> Option<&crate::parse::GenericConstraints> {
140 None
141 }
142}