unistructgen_codegen/builder.rs
1//! Builder pattern for RustRenderer configuration
2//!
3//! Provides a fluent API for configuring Rust code generation options.
4
5use crate::{RenderOptions, RustRenderer};
6
7/// Builder for creating a RustRenderer with fluent API
8///
9/// This builder provides a convenient way to configure rendering options
10/// using method chaining.
11///
12/// # Examples
13///
14/// ```
15/// use unistructgen_codegen::RustRendererBuilder;
16///
17/// let renderer = RustRendererBuilder::new()
18/// .add_header(true)
19/// .add_clippy_allows(true)
20/// .build();
21/// ```
22#[derive(Debug, Clone)]
23pub struct RustRendererBuilder {
24 options: RenderOptions,
25}
26
27impl RustRendererBuilder {
28 /// Create a new builder with default options
29 ///
30 /// # Examples
31 ///
32 /// ```
33 /// use unistructgen_codegen::RustRendererBuilder;
34 ///
35 /// let builder = RustRendererBuilder::new();
36 /// ```
37 pub fn new() -> Self {
38 Self {
39 options: RenderOptions::default(),
40 }
41 }
42
43 /// Enable or disable adding a generated file header
44 ///
45 /// When enabled, adds a comment like:
46 /// ```text
47 /// // Generated by unistructgen v0.1.0
48 /// // Do not edit this file manually
49 /// ```
50 ///
51 /// Default: `true`
52 ///
53 /// # Examples
54 ///
55 /// ```
56 /// use unistructgen_codegen::RustRendererBuilder;
57 ///
58 /// let renderer = RustRendererBuilder::new()
59 /// .add_header(false)
60 /// .build();
61 /// ```
62 pub fn add_header(mut self, enable: bool) -> Self {
63 self.options.add_header = enable;
64 self
65 }
66
67 /// Enable or disable adding clippy allow attributes
68 ///
69 /// When enabled, adds:
70 /// ```text
71 /// #![allow(dead_code)]
72 /// #![allow(unused_imports)]
73 /// ```
74 ///
75 /// Default: `true`
76 ///
77 /// # Examples
78 ///
79 /// ```
80 /// use unistructgen_codegen::RustRendererBuilder;
81 ///
82 /// let renderer = RustRendererBuilder::new()
83 /// .add_clippy_allows(false)
84 /// .build();
85 /// ```
86 pub fn add_clippy_allows(mut self, enable: bool) -> Self {
87 self.options.add_clippy_allows = enable;
88 self
89 }
90
91 /// Configure both header and clippy allows at once
92 ///
93 /// Convenience method for common configurations.
94 ///
95 /// # Examples
96 ///
97 /// ```
98 /// use unistructgen_codegen::RustRendererBuilder;
99 ///
100 /// // Clean output without any annotations
101 /// let renderer = RustRendererBuilder::new()
102 /// .with_annotations(false, false)
103 /// .build();
104 /// ```
105 pub fn with_annotations(mut self, header: bool, clippy_allows: bool) -> Self {
106 self.options.add_header = header;
107 self.options.add_clippy_allows = clippy_allows;
108 self
109 }
110
111 /// Create a minimal renderer (no header, no clippy allows)
112 ///
113 /// Useful for embedding generated code or when you want clean output.
114 ///
115 /// # Examples
116 ///
117 /// ```
118 /// use unistructgen_codegen::RustRendererBuilder;
119 ///
120 /// let renderer = RustRendererBuilder::new()
121 /// .minimal()
122 /// .build();
123 /// ```
124 pub fn minimal(mut self) -> Self {
125 self.options.add_header = false;
126 self.options.add_clippy_allows = false;
127 self
128 }
129
130 /// Get the current options (useful for inspection)
131 ///
132 /// # Examples
133 ///
134 /// ```
135 /// use unistructgen_codegen::RustRendererBuilder;
136 ///
137 /// let builder = RustRendererBuilder::new().add_header(false);
138 /// let options = builder.options();
139 /// assert!(!options.add_header);
140 /// ```
141 pub fn options(&self) -> &RenderOptions {
142 &self.options
143 }
144
145 /// Build the RustRenderer with the configured options
146 ///
147 /// # Examples
148 ///
149 /// ```
150 /// use unistructgen_codegen::RustRendererBuilder;
151 ///
152 /// let renderer = RustRendererBuilder::new()
153 /// .add_header(true)
154 /// .build();
155 /// ```
156 pub fn build(self) -> RustRenderer {
157 RustRenderer::new(self.options)
158 }
159}
160
161impl Default for RustRendererBuilder {
162 fn default() -> Self {
163 Self::new()
164 }
165}
166
167impl RustRenderer {
168 /// Create a builder for configuring a RustRenderer
169 ///
170 /// This is a convenience method that returns a new builder.
171 ///
172 /// # Examples
173 ///
174 /// ```
175 /// use unistructgen_codegen::RustRenderer;
176 ///
177 /// let renderer = RustRenderer::builder()
178 /// .minimal()
179 /// .build();
180 /// ```
181 pub fn builder() -> RustRendererBuilder {
182 RustRendererBuilder::new()
183 }
184}
185
186#[cfg(test)]
187mod tests {
188 use super::*;
189
190 #[test]
191 fn test_builder_default() {
192 let _renderer = RustRendererBuilder::new().build();
193 let builder = RustRendererBuilder::new();
194 let options = builder.options();
195
196 assert!(options.add_header);
197 assert!(options.add_clippy_allows);
198 }
199
200 #[test]
201 fn test_builder_custom() {
202 let _renderer = RustRendererBuilder::new()
203 .add_header(false)
204 .add_clippy_allows(false)
205 .build();
206
207 // Renderer created successfully
208 }
209
210 #[test]
211 fn test_builder_minimal() {
212 let _renderer = RustRendererBuilder::new()
213 .minimal()
214 .build();
215
216 let builder = RustRendererBuilder::new().minimal();
217 let options = builder.options();
218 assert!(!options.add_header);
219 assert!(!options.add_clippy_allows);
220 }
221
222 #[test]
223 fn test_builder_fluent_api() {
224 let _renderer = RustRenderer::builder()
225 .with_annotations(true, false)
226 .build();
227
228 // Renderer created successfully
229 }
230
231 #[test]
232 fn test_builder_options_inspection() {
233 let builder = RustRendererBuilder::new()
234 .add_header(false);
235
236 let options = builder.options();
237 assert!(!options.add_header);
238 assert!(options.add_clippy_allows);
239 }
240}