MCPcopy Create free account
hub / github.com/PowerShell/DSC / discover

Method discover

lib/dsc-lib/src/extensions/discover.rs:58–124  ·  view source on GitHub ↗

Perform discovery of resources using the extension. # Returns A result containing a vector of discovered resources or an error. # Errors This function will return an error if the discovery fails.

(&self)

Source from the content-addressed store, hash-verified

56 ///
57 /// This function will return an error if the discovery fails.
58 pub fn discover(&self) -> Result<Vec<DscResource>, DscError> {
59 let mut resources: Vec<DscResource> = Vec::new();
60
61 if self.capabilities.contains(&Capability::Discover) {
62 let extension = match serde_json::from_value::<ExtensionManifest>(self.manifest.clone()) {
63 Ok(manifest) => manifest,
64 Err(err) => {
65 return Err(DscError::Manifest(self.type_name.to_string(), err));
66 }
67 };
68 let Some(discover) = extension.discover else {
69 return Err(DscError::UnsupportedCapability(self.type_name.to_string(), Capability::Discover.to_string()));
70 };
71 let command_resource_info = CommandResourceInfo {
72 type_name: self.type_name.clone(),
73 path: None,
74 };
75 let args = process_get_args(discover.args.as_ref(), "", &command_resource_info);
76 if let Some(deprecation_message) = extension.deprecation_message.as_ref() {
77 warn!("{}", t!("extensions.dscextension.deprecationMessage", extension = self.type_name, message = deprecation_message));
78 }
79 let (_exit_code, stdout, _stderr) = invoke_command(
80 &discover.executable,
81 args,
82 None,
83 Some(&self.directory),
84 None,
85 extension.exit_codes.as_ref(),
86 )?;
87 if stdout.is_empty() {
88 info!("{}", t!("extensions.dscextension.discoverNoResults", extension = self.type_name));
89 } else {
90 for line in stdout.lines() {
91 trace!("{}", t!("extensions.dscextension.extensionReturned", extension = self.type_name, line = line));
92 let discover_result: DiscoverResult = match serde_json::from_str(line) {
93 Ok(result) => result,
94 Err(err) => {
95 return Err(DscError::Json(err));
96 }
97 };
98 if !discover_result.manifest_path.is_absolute() {
99 return Err(DscError::Extension(t!("extensions.dscextension.discoverNotAbsolutePath", extension = self.type_name.clone(), path = discover_result.manifest_path.display()).to_string()));
100 }
101 // Currently we don't support extensions discovering other extensions
102 let manifests = match load_manifest(&discover_result.manifest_path) {
103 Ok(manifests) => manifests,
104 Err(err) => {
105 info!("{}", t!("extensions.dscextension.failedLoadManifest", extension = self.type_name, err = err));
106 continue;
107 }
108 };
109 for imported_manifest in manifests {
110 if let ImportedManifest::Resource(resource) = imported_manifest {
111 resources.push(resource);
112 }
113 }
114 }
115 }

Callers

nothing calls this directly

Calls 8

process_get_argsFunction · 0.85
JsonClass · 0.85
load_manifestFunction · 0.85
newFunction · 0.50
invoke_commandFunction · 0.50
from_strFunction · 0.50
as_refMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected