diff --git a/hack/dev/configs/kernel.sprout.toml b/hack/dev/configs/kernel.sprout.toml index 4decd42..40404fe 100644 --- a/hack/dev/configs/kernel.sprout.toml +++ b/hack/dev/configs/kernel.sprout.toml @@ -1,7 +1,7 @@ version = 1 -[extractors.boot.filesystem] -item = "\\EFI\\BOOT\\kernel.efi" +[extractors.boot.filesystem-device-match] +has-item = "\\EFI\\BOOT\\kernel.efi" [actions.chainload-kernel] chainload.path = "$boot\\EFI\\BOOT\\kernel.efi" diff --git a/src/extractors.rs b/src/extractors.rs index 6deeee9..d376a47 100644 --- a/src/extractors.rs +++ b/src/extractors.rs @@ -1,19 +1,20 @@ use crate::context::SproutContext; -use crate::extractors::filesystem::FileSystemExtractorConfiguration; +use crate::extractors::filesystem_device_match::FilesystemDeviceMatchExtractor; use anyhow::{Result, bail}; use serde::{Deserialize, Serialize}; use std::rc::Rc; -pub mod filesystem; +pub mod filesystem_device_match; #[derive(Serialize, Deserialize, Default, Clone)] pub struct ExtractorDeclaration { - pub filesystem: Option, + #[serde(default, rename = "filesystem-device-match")] + pub filesystem_device_match: Option, } pub fn extract(context: Rc, extractor: &ExtractorDeclaration) -> Result { - if let Some(filesystem) = &extractor.filesystem { - filesystem::extract(context, filesystem) + if let Some(filesystem) = &extractor.filesystem_device_match { + filesystem_device_match::extract(context, filesystem) } else { bail!("unknown extractor configuration"); } diff --git a/src/extractors/filesystem.rs b/src/extractors/filesystem_device_match.rs similarity index 85% rename from src/extractors/filesystem.rs rename to src/extractors/filesystem_device_match.rs index 3f36a87..75c64c7 100644 --- a/src/extractors/filesystem.rs +++ b/src/extractors/filesystem_device_match.rs @@ -11,14 +11,16 @@ use uefi::proto::media::file::{File, FileSystemVolumeLabel}; use uefi::proto::media::fs::SimpleFileSystem; #[derive(Serialize, Deserialize, Default, Clone)] -pub struct FileSystemExtractorConfiguration { - pub label: Option, - pub item: Option, +pub struct FilesystemDeviceMatchExtractor { + #[serde(default, rename = "has-label")] + pub has_label: Option, + #[serde(default, rename = "has-item")] + pub has_item: Option, } pub fn extract( context: Rc, - device: &FileSystemExtractorConfiguration, + extractor: &FilesystemDeviceMatchExtractor, ) -> Result { let handles = uefi::boot::find_handles::() .context("failed to find filesystem handles")?; @@ -26,7 +28,7 @@ pub fn extract( let mut filesystem = uefi::boot::open_protocol_exclusive::(handle) .context("failed to open filesystem protocol")?; - if let Some(ref label) = device.label { + if let Some(ref label) = extractor.has_label { let want_label = CString16::try_from(context.stamp(label).as_str()) .context("failed to convert label to CString16")?; let mut root = filesystem @@ -41,7 +43,7 @@ pub fn extract( } } - if let Some(ref item) = device.item { + if let Some(ref item) = extractor.has_item { let want_item = CString16::try_from(context.stamp(item).as_str()) .context("failed to convert item to CString16")?; let mut filesystem = FileSystem::new(filesystem);