From 1cfcec074c34900894a897f2b1dfd30bc2f30de1 Mon Sep 17 00:00:00 2001 From: Philip Tricca Date: Thu, 20 Mar 2025 10:49:16 -0700 Subject: [PATCH] Move `enum Chip` from fwidgen to hubtools lib. We do some work here to preserve the existing behavior of the `is_lpc55` function to keep from breaking API compatibility. --- fwidgen/src/main.rs | 36 +------------------------ hubtools/src/lib.rs | 64 +++++++++++++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 51 deletions(-) diff --git a/fwidgen/src/main.rs b/fwidgen/src/main.rs index b581640..e755de5 100644 --- a/fwidgen/src/main.rs +++ b/fwidgen/src/main.rs @@ -4,7 +4,7 @@ use anyhow::{anyhow, Context, Result}; use clap::{Parser, ValueEnum}; -use hubtools::RawHubrisArchive; +use hubtools::{Chip, RawHubrisArchive}; use sha2::{digest::DynDigest, Digest as _, Sha256}; use sha3::Sha3_256; use std::{fmt, ops::Range, str}; @@ -63,40 +63,6 @@ impl Digest { } } -#[derive(Debug)] -enum Chip { - Lpc55, - Stm32, -} - -impl TryFrom<&RawHubrisArchive> for Chip { - type Error = anyhow::Error; - - fn try_from(archive: &RawHubrisArchive) -> Result { - let manifest = archive.extract_file("app.toml")?; - let manifest: toml::Value = toml::from_str( - str::from_utf8(&manifest).context("manifest bytes to UTF8")?, - ) - .context("manifest UTF8 to TOML")?; - - let chip = manifest - .as_table() - .ok_or(anyhow!("manifest isn't a table"))? - .get("chip") - .ok_or(anyhow!("no key \"chip\" in manifest"))? - .as_str() - .ok_or(anyhow!("value for key \"chip\" isn't a string"))?; - - if chip.contains("lpc55") { - Ok(Chip::Lpc55) - } else if chip.contains("stm32") { - Ok(Chip::Stm32) - } else { - Err(anyhow!("Unsupported chip: {}", chip)) - } - } -} - // Return a Range describing the named flash range from memory.toml). fn get_flash_range( name: &str, diff --git a/hubtools/src/lib.rs b/hubtools/src/lib.rs index 0814939..0e351f3 100644 --- a/hubtools/src/lib.rs +++ b/hubtools/src/lib.rs @@ -830,24 +830,12 @@ impl RawHubrisArchive { } fn is_lpc55(&self) -> Result<(), Error> { - let manifest = self.extract_file("app.toml")?; - let manifest: toml::Value = toml::from_str( - std::str::from_utf8(&manifest).map_err(Error::BadManifest)?, - ) - .map_err(Error::BadToml)?; - let chip = manifest - .as_table() - .ok_or(Error::BadTomlType)? - .get("chip") - .ok_or(Error::BadTomlType)? - .as_str() - .ok_or(Error::BadTomlType)? - .to_owned(); + let chip = Chip::try_from(self)?; - if !chip.contains("lpc55") { - Err(Error::WrongChip(chip)) - } else { + if chip == Chip::Lpc55 { Ok(()) + } else { + Err(Error::WrongChip(chip.to_string())) } } @@ -971,6 +959,50 @@ impl RawHubrisArchive { } } +#[derive(Debug, PartialEq)] +pub enum Chip { + Lpc55, + Stm32, +} + +impl TryFrom<&RawHubrisArchive> for Chip { + type Error = Error; + + fn try_from(archive: &RawHubrisArchive) -> Result { + let manifest = archive.extract_file("app.toml")?; + let manifest: toml::Value = toml::from_str( + std::str::from_utf8(&manifest) + .map_err(Error::BadCommentEncoding)?, + ) + .map_err(Error::BadToml)?; + + let chip = manifest + .as_table() + .ok_or(Error::BadTomlType)? + .get("chip") + .ok_or(Error::BadTomlType)? + .as_str() + .ok_or(Error::BadTomlType)?; + + if chip.contains("lpc55") { + Ok(Chip::Lpc55) + } else if chip.contains("stm32") { + Ok(Chip::Stm32) + } else { + Err(Error::WrongChip(chip.to_string())) + } + } +} + +impl std::fmt::Display for Chip { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Chip::Lpc55 => write!(f, "lpc55"), + Chip::Stm32 => write!(f, "stm32"), + } + } +} + mod header { use zerocopy::{AsBytes, FromBytes};