flowey_lib_hvlite/
download_uefi_mu_msvm.rsuse flowey::node::prelude::*;
use std::collections::BTreeMap;
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum MuMsvmArch {
X86_64,
Aarch64,
}
flowey_request! {
pub enum Request {
Version(String),
GetMsvmFd {
arch: MuMsvmArch,
msvm_fd: WriteVar<PathBuf>
}
}
}
new_flow_node!(struct Node);
impl FlowNode for Node {
type Request = Request;
fn imports(ctx: &mut ImportCtx<'_>) {
ctx.import::<flowey_lib_common::install_dist_pkg::Node>();
ctx.import::<flowey_lib_common::download_gh_release::Node>();
}
fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
let mut version = None;
let mut reqs: BTreeMap<MuMsvmArch, Vec<WriteVar<PathBuf>>> = BTreeMap::new();
for req in requests {
match req {
Request::Version(v) => same_across_all_reqs("Version", &mut version, v)?,
Request::GetMsvmFd { arch, msvm_fd } => reqs.entry(arch).or_default().push(msvm_fd),
}
}
let version = version.ok_or(anyhow::anyhow!("Missing essential request: Version"))?;
if reqs.is_empty() {
return Ok(());
}
let extract_zip_deps = flowey_lib_common::_util::extract::extract_zip_if_new_deps(ctx);
for (arch, out_vars) in reqs {
let file_name = match arch {
MuMsvmArch::X86_64 => "RELEASE-X64-artifacts.zip",
MuMsvmArch::Aarch64 => "RELEASE-AARCH64-artifacts.zip",
};
let mu_msvm_zip = ctx.reqv(|v| flowey_lib_common::download_gh_release::Request {
repo_owner: "microsoft".into(),
repo_name: "mu_msvm".into(),
needs_auth: false,
tag: format!("v{version}"),
file_name: file_name.into(),
path: v,
});
let zip_file_version = format!("{version}-{file_name}");
ctx.emit_rust_step(
{
format!(
"unpack mu_msvm package ({})",
match arch {
MuMsvmArch::X86_64 => "x64",
MuMsvmArch::Aarch64 => "aarch64",
},
)
},
|ctx| {
let extract_zip_deps = extract_zip_deps.clone().claim(ctx);
let out_vars = out_vars.claim(ctx);
let mu_msvm_zip = mu_msvm_zip.claim(ctx);
move |rt| {
let mu_msvm_zip = rt.read(mu_msvm_zip);
let extract_dir = flowey_lib_common::_util::extract::extract_zip_if_new(
rt,
extract_zip_deps,
&mu_msvm_zip,
&zip_file_version,
)?;
let msvm_fd = extract_dir.join("FV/MSVM.fd");
for var in out_vars {
rt.write(var, &msvm_fd)
}
Ok(())
}
},
);
}
Ok(())
}
}