(input: &str)
| 9 | use crate::util::get_computer_name; |
| 10 | |
| 11 | pub fn handle_set(input: &str) -> Result<String, String> { |
| 12 | let capability_list: FeatureOnDemandList = serde_json::from_str(input) |
| 13 | .map_err(|e| t!("fod_set.failedParseInput", err = e.to_string()).to_string())?; |
| 14 | |
| 15 | if capability_list.capabilities.is_empty() { |
| 16 | return Err(t!("fod_set.capabilitiesArrayEmpty").to_string()); |
| 17 | } |
| 18 | |
| 19 | let session = DismSessionHandle::open()?; |
| 20 | let mut results = Vec::new(); |
| 21 | let mut reboot_required = false; |
| 22 | |
| 23 | for cap_input in &capability_list.capabilities { |
| 24 | let identity = cap_input |
| 25 | .identity |
| 26 | .as_ref() |
| 27 | .ok_or_else(|| t!("fod_set.identityRequired").to_string())?; |
| 28 | |
| 29 | let desired_state = cap_input |
| 30 | .state |
| 31 | .as_ref() |
| 32 | .ok_or_else(|| t!("fod_set.stateRequired").to_string())?; |
| 33 | |
| 34 | let current = session.get_capability_info(identity)?; |
| 35 | |
| 36 | if current.unknown { |
| 37 | return Err(t!("fod_set.capabilityNotFound", identity = identity).to_string()); |
| 38 | } |
| 39 | |
| 40 | let current_state = CapabilityState::from_dism(current.state); |
| 41 | |
| 42 | let needs_reboot = match desired_state { |
| 43 | CapabilityState::Installed => { |
| 44 | match current_state { |
| 45 | Some(CapabilityState::Installed) => false, |
| 46 | _ => session.add_capability(identity)?, |
| 47 | } |
| 48 | } |
| 49 | CapabilityState::NotPresent => { |
| 50 | match current_state { |
| 51 | Some(CapabilityState::NotPresent) | Some(CapabilityState::Removed) => false, |
| 52 | _ => session.remove_capability(identity)?, |
| 53 | } |
| 54 | } |
| 55 | _ => { |
| 56 | return Err(t!( |
| 57 | "fod_set.unsupportedDesiredState", |
| 58 | state = desired_state.to_string() |
| 59 | ) |
| 60 | .to_string()); |
| 61 | } |
| 62 | }; |
| 63 | |
| 64 | reboot_required = reboot_required || needs_reboot; |
| 65 | |
| 66 | let raw = session.get_capability_info(identity)?; |
| 67 | let info = FeatureOnDemandInfo { |
| 68 | identity: Some(raw.name), |
nothing calls this directly
no test coverage detected