| 6209 | } |
| 6210 | |
| 6211 | fn parse_cli_setting_value(key: &str, raw_value: &str) -> Result<SettingValue> { |
| 6212 | let setting = settings::setting_for_key(key).ok_or_else(|| { |
| 6213 | miette::miette!( |
| 6214 | "unknown setting key '{}'. Allowed keys: {}", |
| 6215 | key, |
| 6216 | settings::registered_keys_csv() |
| 6217 | ) |
| 6218 | })?; |
| 6219 | |
| 6220 | let value = match setting.kind { |
| 6221 | SettingValueKind::String => { |
| 6222 | // Reject typos client-side so `openshell settings set ... |
| 6223 | // proposal_approval_mode autom` errors immediately instead of |
| 6224 | // round-tripping through the server. The server enforces the |
| 6225 | // same check independently for non-CLI callers. |
| 6226 | setting |
| 6227 | .validate_string_value(raw_value) |
| 6228 | .map_err(|allowed| { |
| 6229 | miette::miette!( |
| 6230 | "invalid value '{}' for key '{}'; expected one of: {}", |
| 6231 | raw_value, |
| 6232 | key, |
| 6233 | allowed.join(", ") |
| 6234 | ) |
| 6235 | })?; |
| 6236 | setting_value::Value::StringValue(raw_value.to_string()) |
| 6237 | } |
| 6238 | SettingValueKind::Int => { |
| 6239 | let parsed = raw_value.trim().parse::<i64>().map_err(|_| { |
| 6240 | miette::miette!( |
| 6241 | "invalid int value '{}' for key '{}'; expected base-10 integer", |
| 6242 | raw_value, |
| 6243 | key |
| 6244 | ) |
| 6245 | })?; |
| 6246 | setting_value::Value::IntValue(parsed) |
| 6247 | } |
| 6248 | SettingValueKind::Bool => { |
| 6249 | let parsed = settings::parse_bool_like(raw_value).ok_or_else(|| { |
| 6250 | miette::miette!( |
| 6251 | "invalid bool value '{}' for key '{}'; expected one of: true,false,yes,no,1,0", |
| 6252 | raw_value, |
| 6253 | key |
| 6254 | ) |
| 6255 | })?; |
| 6256 | setting_value::Value::BoolValue(parsed) |
| 6257 | } |
| 6258 | }; |
| 6259 | |
| 6260 | Ok(SettingValue { value: Some(value) }) |
| 6261 | } |
| 6262 | |
| 6263 | fn format_setting_value(value: Option<&SettingValue>) -> String { |
| 6264 | let Some(value) = value.and_then(|v| v.value.as_ref()) else { |