From 094061a17256653255bd6def3998586fe07339d8 Mon Sep 17 00:00:00 2001 From: Ikey Doherty Date: Mon, 3 Feb 2025 06:10:56 +0000 Subject: [PATCH] provisioning: Implement find_disk Signed-off-by: Ikey Doherty --- crates/provisioning/src/commands.rs | 4 +- crates/provisioning/src/commands/find_disk.rs | 39 +++++++++++++++++-- crates/provisioning/src/errors.rs | 16 ++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/crates/provisioning/src/commands.rs b/crates/provisioning/src/commands.rs index 6854059..173f4d3 100644 --- a/crates/provisioning/src/commands.rs +++ b/crates/provisioning/src/commands.rs @@ -13,7 +13,7 @@ mod find_disk; pub enum Command { CreatePartition, CreatePartitionTable(Box), - FindDisk, + FindDisk(Box), } /// Command execution function @@ -21,7 +21,7 @@ type CommandExec = for<'a> fn(Context<'a>) -> Result; /// Map of command names to functions static COMMANDS: phf::Map<&'static str, CommandExec> = phf::phf_map! { - //"find-disk" => find_disk::parse, + "find-disk" => find_disk::parse, //"create-partition" => create_partition::parse, "create-partition-table" => create_partition_table::parse, }; diff --git a/crates/provisioning/src/commands/find_disk.rs b/crates/provisioning/src/commands/find_disk.rs index 3b2896a..bf44836 100644 --- a/crates/provisioning/src/commands/find_disk.rs +++ b/crates/provisioning/src/commands/find_disk.rs @@ -2,10 +2,43 @@ // // SPDX-License-Identifier: MPL-2.0 -use super::Command; +use itertools::Itertools; + use crate::Context; +#[derive(Debug)] +pub struct Command { + pub name: String, +} + /// Generate a command to find a disk -pub(crate) fn parse(_context: Context<'_>) -> Result { - unimplemented!("Command not implemented"); +pub(crate) fn parse(context: Context<'_>) -> Result { + let arguments = context + .node + .entries() + .iter() + .filter(|e| e.is_empty() || e.name().is_none()) + .collect_vec(); + + let name = match arguments.len() { + 0 => { + return Err(crate::InvalidArguments { + at: context.node.span(), + advice: Some("find-disk - provide a name for the storage device".into()), + } + .into()) + } + 1 => arguments[0].value().as_string().ok_or(crate::InvalidType { + at: arguments[0].span(), + })?, + _ => { + return Err(crate::InvalidArguments { + at: context.node.span(), + advice: Some("find-disk - only one positional argument supported".into()), + } + .into()) + } + }; + + Ok(super::Command::FindDisk(Box::new(Command { name: name.to_owned() }))) } diff --git a/crates/provisioning/src/errors.rs b/crates/provisioning/src/errors.rs index c031287..6902781 100644 --- a/crates/provisioning/src/errors.rs +++ b/crates/provisioning/src/errors.rs @@ -23,6 +23,10 @@ pub enum Error { #[error("unknown variant")] UnknownVariant, + #[diagnostic(transparent)] + #[error(transparent)] + InvalidArguments(#[from] InvalidArguments), + #[diagnostic(transparent)] #[error(transparent)] InvalidType(#[from] InvalidType), @@ -97,3 +101,15 @@ pub struct UnsupportedValue { #[help] pub advice: Option, } + +/// Error for invalid arguments +#[derive(Debug, Diagnostic, Error)] +#[error("invalid arguments")] +#[diagnostic(severity(error))] +pub struct InvalidArguments { + #[label] + pub at: SourceSpan, + + #[help] + pub advice: Option, +}