diff --git a/Cargo.lock b/Cargo.lock index 789642ec072122a5d66ba446bd69e7e6c369502f..7da54587d0a2622d4f89204a20d1b64b326b7996 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18000,6 +18000,7 @@ dependencies = [ "gpui", "schemars", "serde", + "serde_json", "settings", "workspace-hack", ] diff --git a/crates/agent_settings/Cargo.toml b/crates/agent_settings/Cargo.toml index e0df5af0aae0bf1e61142c19d7544b2362635981..07fbd74b4e91531ad2d5e572e00b9b1c2068f208 100644 --- a/crates/agent_settings/Cargo.toml +++ b/crates/agent_settings/Cargo.toml @@ -19,6 +19,7 @@ gpui.workspace = true language_model.workspace = true schemars.workspace = true serde.workspace = true +serde_json.workspace = true settings.workspace = true workspace-hack.workspace = true vim_mode_setting.workspace = true diff --git a/crates/agent_settings/src/agent_settings.rs b/crates/agent_settings/src/agent_settings.rs index 9a02a779397373d0c3afcb1d666bf8903ff6b7b4..d4d1cd9dc0cc575ce24177095381752e948a76c5 100644 --- a/crates/agent_settings/src/agent_settings.rs +++ b/crates/agent_settings/src/agent_settings.rs @@ -90,23 +90,19 @@ impl JsonSchema for AgentEditorMode { "AgentEditorMode".into() } - fn json_schema(schema_gen: &mut schemars::SchemaGenerator) -> schemars::Schema { - let editor_mode_schema = EditorMode::json_schema(schema_gen); - - // TODO: This schema is incorrect. Need to extend editor_mode_schema with `inherit` - let result = json_schema!({ - "oneOf": [ - { - "const": "inherit", - "description": "Inherit editor mode from global settings" - }, - editor_mode_schema - ], - "description": "Agent editor mode - either inherit from global settings or override with a specific mode" - }); + fn json_schema(_gen: &mut schemars::SchemaGenerator) -> schemars::Schema { + use vim_mode_setting::EditorMode; + + let mut options = vec![serde_json::json!({ + "const": "inherit", + "description": "Inherit editor mode from global settings" + })]; + options.extend(EditorMode::get_schema_options()); - dbg!(&result); - result + json_schema!({ + "oneOf": options, + "description": "Agent editor mode - either inherit from global settings or override with a specific mode" + }) } } diff --git a/crates/vim_mode_setting/Cargo.toml b/crates/vim_mode_setting/Cargo.toml index ef4fde738f569e9a1b08bc551559daa042b4faf4..562632d1db584504e8df430a0ee68cf8464d60ac 100644 --- a/crates/vim_mode_setting/Cargo.toml +++ b/crates/vim_mode_setting/Cargo.toml @@ -18,3 +18,4 @@ schemars.workspace = true settings.workspace = true workspace-hack.workspace = true serde.workspace = true +serde_json.workspace = true diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 46f67cb870ec9e56179419cd8c4889df1bb72a00..663b198bd0d491494e0fb4bf50b5fce59646cc10 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -38,45 +38,9 @@ impl JsonSchema for EditorMode { } fn json_schema(_gen: &mut schemars::SchemaGenerator) -> Schema { + let options = Self::get_schema_options(); json_schema!({ - "oneOf": [ - { - "const": "default", - "description": "Standard editing mode" - }, - { - "const": "vim", - "description": "Vim normal mode" - }, - { - "const": "vim_normal", - "description": "Vim normal mode" - }, - { - "const": "vim_insert", - "description": "Vim insert mode" - }, - { - "const": "vim_replace", - "description": "Vim replace mode" - }, - { - "const": "vim_visual", - "description": "Vim visual mode" - }, - { - "const": "vim_visual_line", - "description": "Vim visual line mode" - }, - { - "const": "vim_visual_block", - "description": "Vim visual block mode" - }, - { - "const": "helix_experimental", - "description": "Helix mode (experimental)" - } - ], + "oneOf": options, "description": "Editor mode" }) } @@ -192,4 +156,45 @@ impl EditorMode { pub fn vim() -> EditorMode { EditorMode::Vim(ModalMode::default()) } + + pub fn get_schema_options() -> Vec { + vec![ + serde_json::json!({ + "const": "default", + "description": "Standard editing mode" + }), + serde_json::json!({ + "const": "vim", + "description": "Vim normal mode" + }), + serde_json::json!({ + "const": "vim_normal", + "description": "Vim normal mode" + }), + serde_json::json!({ + "const": "vim_insert", + "description": "Vim insert mode" + }), + serde_json::json!({ + "const": "vim_replace", + "description": "Vim replace mode" + }), + serde_json::json!({ + "const": "vim_visual", + "description": "Vim visual mode" + }), + serde_json::json!({ + "const": "vim_visual_line", + "description": "Vim visual line mode" + }), + serde_json::json!({ + "const": "vim_visual_block", + "description": "Vim visual block mode" + }), + serde_json::json!({ + "const": "helix_experimental", + "description": "Helix mode (experimental)" + }), + ] + } }