aboutsummaryrefslogtreecommitdiff
path: root/mling/src/proj_mgr/generator.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-06-26 07:44:31 +0800
committer魏曹先生 <1992414357@qq.com>2026-06-26 07:44:31 +0800
commita73f0f692968a04fb6f99ffbf6a2538cb482815f (patch)
treeab9afd18913ca113ff6cc577077eb682b7edc01b /mling/src/proj_mgr/generator.rs
parent30e8275059fc66ddc996513f60f536732378d6cf (diff)
feat(proj_mgr): add project generation with interactive checklist
Diffstat (limited to 'mling/src/proj_mgr/generator.rs')
-rw-r--r--mling/src/proj_mgr/generator.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/mling/src/proj_mgr/generator.rs b/mling/src/proj_mgr/generator.rs
new file mode 100644
index 0000000..bcc6e5b
--- /dev/null
+++ b/mling/src/proj_mgr/generator.rs
@@ -0,0 +1,39 @@
+use std::path::{self, PathBuf};
+
+use mingling::{Groupped, macros::{chain, pack, r_println, renderer, route}};
+
+use crate::{EntryGenerateProject, Next, res::ResCurrentDir};
+
+pack!(StateGenerateProjectReady = PathBuf);
+pack!(ResultGenerateProjectChecklistCreated = PathBuf);
+
+pack!(StateGenerateProjectExecBegin = PathBuf);
+pack!(StateGenerateProjectExecuting = ());
+
+const CHECK_LIST_NAME: &str = "CHECKLIST.md";
+const CHECK_LIST_CONTENT: &str = include_str!("../../res/CHECKLIST.md");
+
+#[chain]
+pub fn handle_generate(_args: EntryGenerateProject, cwd: &ResCurrentDir) -> Next {
+ let checklist_path = cwd.path.join(CHECK_LIST_NAME);
+
+ if !checklist_path.exists() {
+ StateGenerateProjectReady::new(checklist_path).to_chain()
+ } else {
+ StateGenerateProjectExecBegin::new(checklist_path).to_chain()
+ }
+}
+
+#[chain]
+pub fn handle_state_gen_proj_ready(prev: StateGenerateProjectReady) -> Next {
+ let path = prev.inner;
+ route!(std::fs::write(&path, CHECK_LIST_CONTENT));
+ ResultGenerateProjectChecklistCreated::new(path).to_render()
+}
+
+#[renderer]
+pub fn render_gen_proj_checklist_created(result: ResultGenerateProjectChecklistCreated) {
+ r_println!("Successfully create {} at \"{}\"", CHECK_LIST_NAME, result.to_string_lossy());
+ r_println!("");
+ r_println!("Please fill in {CHECK_LIST_NAME} and run `mling gen` again to continue generating");
+}