(input: &str)
| 9 | use crate::util::get_computer_name; |
| 10 | |
| 11 | pub fn handle_set(input: &str) -> Result<String, String> { |
| 12 | let feature_list: OptionalFeatureList = serde_json::from_str(input) |
| 13 | .map_err(|e| t!("set.failedParseInput", err = e.to_string()).to_string())?; |
| 14 | |
| 15 | if feature_list.features.is_empty() { |
| 16 | return Err(t!("set.featuresArrayEmpty").to_string()); |
| 17 | } |
| 18 | |
| 19 | let session = DismSessionHandle::open()?; |
| 20 | let mut results = Vec::new(); |
| 21 | let mut reboot_required = false; |
| 22 | |
| 23 | for feature_input in &feature_list.features { |
| 24 | let feature_name = feature_input |
| 25 | .feature_name |
| 26 | .as_ref() |
| 27 | .ok_or_else(|| t!("set.featureNameRequired").to_string())?; |
| 28 | |
| 29 | let desired_state = feature_input |
| 30 | .state |
| 31 | .as_ref() |
| 32 | .ok_or_else(|| t!("set.stateRequired").to_string())?; |
| 33 | |
| 34 | let needs_reboot = match desired_state { |
| 35 | FeatureState::Installed => { |
| 36 | session.enable_feature(feature_name)? |
| 37 | } |
| 38 | FeatureState::NotPresent => { |
| 39 | session.disable_feature(feature_name, false)? |
| 40 | } |
| 41 | FeatureState::Removed => { |
| 42 | session.disable_feature(feature_name, true)? |
| 43 | } |
| 44 | _ => { |
| 45 | return Err(t!( |
| 46 | "set.unsupportedDesiredState", |
| 47 | state = desired_state.to_string() |
| 48 | ) |
| 49 | .to_string()); |
| 50 | } |
| 51 | }; |
| 52 | |
| 53 | reboot_required = reboot_required || needs_reboot; |
| 54 | |
| 55 | let info = session.get_feature_info(feature_name)?; |
| 56 | results.push(info); |
| 57 | } |
| 58 | |
| 59 | let restart_required_meta = if reboot_required { |
| 60 | let mut entry = Map::new(); |
| 61 | entry.insert("system".to_string(), Value::String(get_computer_name())); |
| 62 | Some(vec![entry]) |
| 63 | } else { |
| 64 | None |
| 65 | }; |
| 66 | |
| 67 | let output = OptionalFeatureList { restart_required_meta, features: results }; |
| 68 | serde_json::to_string(&output) |
nothing calls this directly
no test coverage detected