tycode_core/file/modify/
mod.rs1pub mod apply_codex_patch;
7pub mod cline_replace_in_file;
8pub mod command;
9pub mod delete_file;
10pub mod replace_in_file;
11pub mod write_file;
12
13use std::path::PathBuf;
14use std::sync::Arc;
15
16use anyhow::Result;
17
18use crate::file::config::File;
19use crate::module::ContextComponent;
20use crate::module::Module;
21use crate::module::PromptComponent;
22use crate::module::SlashCommand;
23use crate::settings::config::FileModificationApi;
24use crate::settings::SettingsManager;
25use crate::tools::r#trait::ToolExecutor;
26
27use command::FileApiSlashCommand;
28
29use apply_codex_patch::ApplyCodexPatchTool;
30use cline_replace_in_file::ClineReplaceInFileTool;
31use delete_file::DeleteFileTool;
32use replace_in_file::ReplaceInFileTool;
33use write_file::WriteFileTool;
34
35pub struct FileModifyModule {
42 write_file: Arc<WriteFileTool>,
43 delete_file: Arc<DeleteFileTool>,
44 apply_codex_patch: Arc<ApplyCodexPatchTool>,
45 replace_in_file: Arc<ReplaceInFileTool>,
46 cline_replace_in_file: Arc<ClineReplaceInFileTool>,
47 settings: SettingsManager,
48}
49
50impl FileModifyModule {
51 pub fn new(workspace_roots: Vec<PathBuf>, settings: SettingsManager) -> Result<Self> {
52 Ok(Self {
53 write_file: Arc::new(WriteFileTool::new(workspace_roots.clone())?),
54 delete_file: Arc::new(DeleteFileTool::new(workspace_roots.clone())?),
55 apply_codex_patch: Arc::new(ApplyCodexPatchTool::new(workspace_roots.clone())?),
56 replace_in_file: Arc::new(ReplaceInFileTool::new(workspace_roots.clone())?),
57 cline_replace_in_file: Arc::new(ClineReplaceInFileTool::new(workspace_roots)?),
58 settings,
59 })
60 }
61}
62
63impl Module for FileModifyModule {
64 fn prompt_components(&self) -> Vec<Arc<dyn PromptComponent>> {
65 vec![]
66 }
67
68 fn context_components(&self) -> Vec<Arc<dyn ContextComponent>> {
69 vec![]
70 }
71
72 fn slash_commands(&self) -> Vec<Arc<dyn SlashCommand>> {
73 vec![Arc::new(FileApiSlashCommand)]
74 }
75
76 fn tools(&self) -> Vec<Arc<dyn ToolExecutor>> {
77 let modify_file: Arc<dyn ToolExecutor> = match self
78 .settings
79 .get_module_config::<File>(File::NAMESPACE)
80 .file_modification_api
81 {
82 FileModificationApi::Patch => self.apply_codex_patch.clone(),
83 FileModificationApi::Default | FileModificationApi::FindReplace => {
84 self.replace_in_file.clone()
85 }
86 FileModificationApi::ClineSearchReplace => self.cline_replace_in_file.clone(),
87 };
88
89 vec![
90 self.write_file.clone(),
91 self.delete_file.clone(),
92 modify_file,
93 ]
94 }
95}