tycode_core/file/modify/
command.rs1use crate::chat::actor::ActorState;
2use crate::chat::events::ChatMessage;
3use crate::file::config::File;
4use crate::module::SlashCommand;
5use crate::settings::config::FileModificationApi;
6
7pub struct FileApiSlashCommand;
8
9#[async_trait::async_trait(?Send)]
10impl SlashCommand for FileApiSlashCommand {
11 fn name(&self) -> &'static str {
12 "fileapi"
13 }
14
15 fn description(&self) -> &'static str {
16 "Set the file modification API (patch, find-replace, or cline-search-replace)"
17 }
18
19 fn usage(&self) -> &'static str {
20 "/fileapi <patch|findreplace|clinesearchreplace>"
21 }
22
23 fn hidden(&self) -> bool {
24 false
25 }
26
27 async fn execute(&self, state: &mut ActorState, args: &[&str]) -> Vec<ChatMessage> {
28 let Some(api_name) = args.first() else {
29 return show_current(state);
30 };
31
32 let (api, label) = match api_name.to_lowercase().as_str() {
33 "patch" => (FileModificationApi::Patch, "patch"),
34 "findreplace" | "find-replace" => (FileModificationApi::FindReplace, "find-replace"),
35 "clinesearchreplace" | "cline-search-replace" => (
36 FileModificationApi::ClineSearchReplace,
37 "cline-search-replace",
38 ),
39 _ => {
40 return vec![ChatMessage::error(
41 "Unknown file API. Use: patch, findreplace, clinesearchreplace".to_string(),
42 )];
43 }
44 };
45
46 let mut config: File = state.settings.get_module_config(File::NAMESPACE);
47 config.file_modification_api = api;
48 state.settings.set_module_config(File::NAMESPACE, config);
49
50 vec![ChatMessage::system(format!(
51 "File modification API set to: {label}"
52 ))]
53 }
54}
55
56fn show_current(state: &ActorState) -> Vec<ChatMessage> {
57 let file_config: File = state.settings.get_module_config(File::NAMESPACE);
58 let current_api = match file_config.file_modification_api {
59 FileModificationApi::Patch => "patch",
60 FileModificationApi::FindReplace => "find-replace",
61 FileModificationApi::ClineSearchReplace => "cline-search-replace",
62 FileModificationApi::Default => "default",
63 };
64 vec![ChatMessage::system(format!(
65 "Current file modification API: {current_api}. Usage: /fileapi <patch|findreplace|clinesearchreplace>"
66 ))]
67}