(app: &App, tx: mpsc::UnboundedSender<Event>)
| 2032 | } |
| 2033 | |
| 2034 | fn spawn_set_global_setting(app: &App, tx: mpsc::UnboundedSender<Event>) { |
| 2035 | let Some(ref edit) = app.setting_edit else { |
| 2036 | return; |
| 2037 | }; |
| 2038 | let Some(entry) = app.global_settings.get(edit.index) else { |
| 2039 | return; |
| 2040 | }; |
| 2041 | |
| 2042 | let key = entry.key.clone(); |
| 2043 | let raw = edit.input.trim().to_string(); |
| 2044 | let kind = entry.kind; |
| 2045 | let mut client = app.client.clone(); |
| 2046 | |
| 2047 | tokio::spawn(async move { |
| 2048 | // Build the typed SettingValue from the validated input. |
| 2049 | use openshell_core::proto::{SettingValue, UpdateConfigRequest, setting_value}; |
| 2050 | |
| 2051 | let value = match kind { |
| 2052 | openshell_core::settings::SettingValueKind::Bool => { |
| 2053 | if let Some(v) = openshell_core::settings::parse_bool_like(&raw) { |
| 2054 | setting_value::Value::BoolValue(v) |
| 2055 | } else { |
| 2056 | let _ = tx.send(Event::GlobalSettingSetResult(Err(format!( |
| 2057 | "invalid bool value: {raw}" |
| 2058 | )))); |
| 2059 | return; |
| 2060 | } |
| 2061 | } |
| 2062 | openshell_core::settings::SettingValueKind::Int => { |
| 2063 | if let Ok(v) = raw.parse::<i64>() { |
| 2064 | setting_value::Value::IntValue(v) |
| 2065 | } else { |
| 2066 | let _ = tx.send(Event::GlobalSettingSetResult(Err(format!( |
| 2067 | "invalid int value: {raw}" |
| 2068 | )))); |
| 2069 | return; |
| 2070 | } |
| 2071 | } |
| 2072 | openshell_core::settings::SettingValueKind::String => { |
| 2073 | setting_value::Value::StringValue(raw) |
| 2074 | } |
| 2075 | }; |
| 2076 | |
| 2077 | let req = UpdateConfigRequest { |
| 2078 | name: String::new(), |
| 2079 | policy: None, |
| 2080 | setting_key: key, |
| 2081 | setting_value: Some(SettingValue { value: Some(value) }), |
| 2082 | delete_setting: false, |
| 2083 | global: true, |
| 2084 | merge_operations: vec![], |
| 2085 | expected_resource_version: 0, |
| 2086 | }; |
| 2087 | |
| 2088 | let result = tokio::time::timeout(Duration::from_secs(5), client.update_config(req)).await; |
| 2089 | |
| 2090 | let event = match result { |
| 2091 | Ok(Ok(resp)) => Event::GlobalSettingSetResult(Ok(resp.into_inner().settings_revision)), |
no test coverage detected