Skip to main content

tycode_core/file/modify/
command.rs

1use 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}