Skip to main content

common/generator/
file_list_builder.rs

1use crate::entities::{File, FileNature, FileStatus};
2
3pub struct FileListBuilder {
4    files: Vec<File>,
5}
6
7impl FileListBuilder {
8    pub fn new() -> Self {
9        Self { files: Vec::new() }
10    }
11
12    /// Add a file with the 5 essential fields. Returns `&mut File`
13    /// so the caller can set optional fields directly.
14    pub fn add(
15        &mut self,
16        name: impl Into<String>,
17        relative_path: impl Into<String>,
18        group: impl Into<String>,
19        template_name: impl Into<String>,
20        nature: FileNature,
21    ) -> &mut File {
22        let now = chrono::Utc::now();
23        self.files.push(File {
24            id: 0,
25            created_at: now,
26            updated_at: now,
27            name: name.into(),
28            relative_path: relative_path.into(),
29            group: group.into(),
30            template_name: template_name.into(),
31            generated_code: None,
32            status: FileStatus::Unknown,
33            nature,
34            feature: None,
35            all_features: false,
36            entity: None,
37            all_entities: false,
38            use_case: None,
39            all_use_cases: false,
40            field: None,
41        });
42        self.files.last_mut().unwrap()
43    }
44
45    /// Add multiple files that share the same path, group, and nature.
46    /// Each tuple is (name, template_name).
47    pub fn add_batch(
48        &mut self,
49        relative_path: &str,
50        group: &str,
51        nature: FileNature,
52        entries: &[(&str, &str)],
53    ) {
54        for &(name, template_name) in entries {
55            self.add(name, relative_path, group, template_name, nature.clone());
56        }
57    }
58
59    /// Consume the builder and return the file list.
60    pub fn build(self) -> Vec<File> {
61        self.files
62    }
63
64    /// Consume the builder, applying a filter, and return filtered files.
65    pub fn build_filtered(self, predicate: impl Fn(&File) -> bool) -> Vec<File> {
66        self.files.into_iter().filter(predicate).collect()
67    }
68}
69
70impl Default for FileListBuilder {
71    fn default() -> Self {
72        Self::new()
73    }
74}