add serialize and deserialize for agent settings

Smit Barmase and Oleksiy Syvokon created

Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>

Change summary

crates/agent_settings/src/agent_settings.rs | 31 +++++++++++++++++++++-
1 file changed, 29 insertions(+), 2 deletions(-)

Detailed changes

crates/agent_settings/src/agent_settings.rs 🔗

@@ -7,7 +7,7 @@ use collections::IndexMap;
 use gpui::{App, Pixels, SharedString};
 use language_model::LanguageModel;
 use schemars::{JsonSchema, json_schema};
-use serde::{Deserialize, Serialize};
+use serde::{Deserialize, Deserializer, Serialize, Serializer};
 use settings::{Settings, SettingsSources};
 use std::borrow::Cow;
 use vim_mode_setting::EditorMode;
@@ -49,13 +49,40 @@ pub enum NotifyWhenAgentWaiting {
     Never,
 }
 
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
+#[derive(Copy, Clone, Debug, PartialEq, Eq, JsonSchema, Default)]
 pub enum AgentEditorMode {
     EditorModeOverride(EditorMode),
     #[default]
     Inherit,
 }
 
+impl<'de> Deserialize<'de> for AgentEditorMode {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: Deserializer<'de>,
+    {
+        let s = String::deserialize(deserializer)?;
+        if s == "inherit" {
+            Ok(AgentEditorMode::Inherit)
+        } else {
+            let mode = EditorMode::deserialize(serde::de::value::StringDeserializer::new(s))?;
+            Ok(AgentEditorMode::EditorModeOverride(mode))
+        }
+    }
+}
+
+impl Serialize for AgentEditorMode {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        match self {
+            AgentEditorMode::EditorModeOverride(mode) => mode.serialize(serializer),
+            AgentEditorMode::Inherit => serializer.serialize_str("inherit"),
+        }
+    }
+}
+
 impl From<EditorMode> for AgentEditorMode {
     fn from(b: EditorMode) -> Self {
         AgentEditorMode::EditorModeOverride(b)