Skip to main content

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}