- replace anyhow by thiserror
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ome-metadata"
|
name = "ome-metadata"
|
||||||
version = "0.2.2"
|
version = "0.3.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
rust-version = "1.85.1"
|
rust-version = "1.85.1"
|
||||||
authors = ["Wim Pomp <w.pomp@nki.nl>"]
|
authors = ["Wim Pomp <w.pomp@nki.nl>"]
|
||||||
@@ -19,10 +19,10 @@ name = "ome_metadata"
|
|||||||
crate-type = ["cdylib", "rlib"]
|
crate-type = ["cdylib", "rlib"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.98"
|
|
||||||
enum-utils = "0.1.2"
|
enum-utils = "0.1.2"
|
||||||
serde = { version = "1.0.219", features = ["derive"] }
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
quick-xml = { version = "0.37.5", features = ["serialize"] }
|
thiserror = "2.0.16"
|
||||||
|
quick-xml = { version = "0.38.0", features = ["serialize"] }
|
||||||
|
|
||||||
[dependencies.pyo3]
|
[dependencies.pyo3]
|
||||||
version = "0.24.2"
|
version = "0.24.2"
|
||||||
|
|||||||
14
src/error.rs
Normal file
14
src/error.rs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
use quick_xml::DeError;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum Error {
|
||||||
|
#[error("io error: {0}")]
|
||||||
|
IO(#[from] std::io::Error),
|
||||||
|
#[error("serde error: {0}")]
|
||||||
|
SerdeXml(#[from] DeError),
|
||||||
|
#[error("size of {0} is unknown")]
|
||||||
|
SizeOfUnknown(String),
|
||||||
|
#[error("no conversion to K by multiplication only")]
|
||||||
|
TemparatureConversion,
|
||||||
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
pub mod ome;
|
pub mod ome;
|
||||||
|
|
||||||
|
mod error;
|
||||||
#[cfg(feature = "python")]
|
#[cfg(feature = "python")]
|
||||||
mod py;
|
mod py;
|
||||||
|
|
||||||
use anyhow::{Error, Result};
|
use crate::error::Error;
|
||||||
pub use ome::Ome;
|
pub use ome::Ome;
|
||||||
use quick_xml::de::from_str;
|
use quick_xml::de::from_str;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
@@ -12,7 +13,7 @@ use std::str::FromStr;
|
|||||||
impl FromStr for Ome {
|
impl FromStr for Ome {
|
||||||
type Err = Error;
|
type Err = Error;
|
||||||
|
|
||||||
fn from_str(s: &str) -> Result<Self> {
|
fn from_str(s: &str) -> Result<Self, Error> {
|
||||||
Ok(from_str(s)?)
|
Ok(from_str(s)?)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,7 +27,7 @@ mod tests {
|
|||||||
($($name:ident: $file:expr $(,)?)*) => {
|
($($name:ident: $file:expr $(,)?)*) => {
|
||||||
$(
|
$(
|
||||||
#[test]
|
#[test]
|
||||||
fn $name() -> Result<()> {
|
fn $name() -> Result<(), Error> {
|
||||||
let file = read_to_string(format!("tests/{}.xml", $file))?;
|
let file = read_to_string(format!("tests/{}.xml", $file))?;
|
||||||
let _ome: Ome = file.parse()?;
|
let _ome: Ome = file.parse()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
30
src/ome.rs
30
src/ome.rs
@@ -1,4 +1,4 @@
|
|||||||
use anyhow::{Result, anyhow};
|
use crate::error::Error;
|
||||||
use enum_utils::{FromStr, IterVariants};
|
use enum_utils::{FromStr, IterVariants};
|
||||||
#[cfg(feature = "python")]
|
#[cfg(feature = "python")]
|
||||||
use pyo3::types::{PyDict, PyInt, PyString};
|
use pyo3::types::{PyDict, PyInt, PyString};
|
||||||
@@ -2762,10 +2762,10 @@ pub struct XmlAnnotationValue;
|
|||||||
|
|
||||||
pub trait Convert: PartialEq {
|
pub trait Convert: PartialEq {
|
||||||
/// conversion factor between this and SI value
|
/// conversion factor between this and SI value
|
||||||
fn as_si(&self) -> Result<f64>;
|
fn as_si(&self) -> Result<f64, Error>;
|
||||||
|
|
||||||
/// convert a value with this unit into another unit
|
/// convert a value with this unit into another unit
|
||||||
fn convert(&self, unit: &Self, value: f64) -> Result<f64> {
|
fn convert(&self, unit: &Self, value: f64) -> Result<f64, Error> {
|
||||||
if self == unit {
|
if self == unit {
|
||||||
Ok(value)
|
Ok(value)
|
||||||
} else {
|
} else {
|
||||||
@@ -2798,7 +2798,7 @@ impl_enum_variants!(
|
|||||||
);
|
);
|
||||||
|
|
||||||
impl Convert for UnitsElectricPotential {
|
impl Convert for UnitsElectricPotential {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsElectricPotential::YV => Ok(1e24),
|
UnitsElectricPotential::YV => Ok(1e24),
|
||||||
UnitsElectricPotential::ZV => Ok(1e21),
|
UnitsElectricPotential::ZV => Ok(1e21),
|
||||||
@@ -2826,7 +2826,7 @@ impl Convert for UnitsElectricPotential {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsFrequency {
|
impl Convert for UnitsFrequency {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsFrequency::YHz => Ok(1e24),
|
UnitsFrequency::YHz => Ok(1e24),
|
||||||
UnitsFrequency::ZHz => Ok(1e21),
|
UnitsFrequency::ZHz => Ok(1e21),
|
||||||
@@ -2854,7 +2854,7 @@ impl Convert for UnitsFrequency {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsLength {
|
impl Convert for UnitsLength {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsLength::Ym => Ok(1e24),
|
UnitsLength::Ym => Ok(1e24),
|
||||||
UnitsLength::Zm => Ok(1e21),
|
UnitsLength::Zm => Ok(1e21),
|
||||||
@@ -2888,14 +2888,14 @@ impl Convert for UnitsLength {
|
|||||||
UnitsLength::Ly => Ok(9.461e15),
|
UnitsLength::Ly => Ok(9.461e15),
|
||||||
UnitsLength::Pc => Ok(3.086e16),
|
UnitsLength::Pc => Ok(3.086e16),
|
||||||
UnitsLength::Pt => Ok(3.52778e-4),
|
UnitsLength::Pt => Ok(3.52778e-4),
|
||||||
UnitsLength::Pixel => Err(anyhow!("Size of pixel is unknown")),
|
UnitsLength::Pixel => Err(Error::SizeOfUnknown("pixel".to_string())),
|
||||||
UnitsLength::ReferenceFrame => Err(anyhow!("Size of reference frame is unknown")),
|
UnitsLength::ReferenceFrame => Err(Error::SizeOfUnknown("reference frame".to_string())),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsPower {
|
impl Convert for UnitsPower {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsPower::YW => Ok(1e24),
|
UnitsPower::YW => Ok(1e24),
|
||||||
UnitsPower::ZW => Ok(1e21),
|
UnitsPower::ZW => Ok(1e21),
|
||||||
@@ -2923,7 +2923,7 @@ impl Convert for UnitsPower {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsPressure {
|
impl Convert for UnitsPressure {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsPressure::YPa => Ok(1e24),
|
UnitsPressure::YPa => Ok(1e24),
|
||||||
UnitsPressure::ZPa => Ok(1e21),
|
UnitsPressure::ZPa => Ok(1e21),
|
||||||
@@ -2962,16 +2962,16 @@ impl Convert for UnitsPressure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsTemperature {
|
impl Convert for UnitsTemperature {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsTemperature::C => Err(anyhow!("No conversion to K by multiplication only")),
|
UnitsTemperature::C => Err(Error::TemparatureConversion),
|
||||||
UnitsTemperature::F => Err(anyhow!("No conversion to K by multiplication only")),
|
UnitsTemperature::F => Err(Error::TemparatureConversion),
|
||||||
UnitsTemperature::K => Ok(1e1),
|
UnitsTemperature::K => Ok(1e1),
|
||||||
UnitsTemperature::R => Ok(5f64 / 9f64),
|
UnitsTemperature::R => Ok(5f64 / 9f64),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn convert(&self, unit: &Self, value: f64) -> Result<f64> {
|
fn convert(&self, unit: &Self, value: f64) -> Result<f64, Error> {
|
||||||
match (self, unit) {
|
match (self, unit) {
|
||||||
(UnitsTemperature::F, UnitsTemperature::C) => Ok((value - 32.) * 5. / 9.),
|
(UnitsTemperature::F, UnitsTemperature::C) => Ok((value - 32.) * 5. / 9.),
|
||||||
(UnitsTemperature::K, UnitsTemperature::C) => Ok(value - 273.15),
|
(UnitsTemperature::K, UnitsTemperature::C) => Ok(value - 273.15),
|
||||||
@@ -2991,7 +2991,7 @@ impl Convert for UnitsTemperature {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Convert for UnitsTime {
|
impl Convert for UnitsTime {
|
||||||
fn as_si(&self) -> Result<f64> {
|
fn as_si(&self) -> Result<f64, Error> {
|
||||||
match self {
|
match self {
|
||||||
UnitsTime::Ys => Ok(1e24),
|
UnitsTime::Ys => Ok(1e24),
|
||||||
UnitsTime::Zs => Ok(1e21),
|
UnitsTime::Zs => Ok(1e21),
|
||||||
|
|||||||
10
src/py.rs
10
src/py.rs
@@ -1,12 +1,11 @@
|
|||||||
use crate::Ome;
|
use crate::Ome;
|
||||||
use crate::ome::{
|
use crate::ome::{
|
||||||
Convert, UnitsElectricPotential, UnitsFrequency, UnitsLength, UnitsPower,
|
Convert, UnitsElectricPotential, UnitsFrequency, UnitsLength, UnitsPower, UnitsPressure,
|
||||||
UnitsPressure, UnitsTemperature, UnitsTime,
|
UnitsTemperature, UnitsTime,
|
||||||
};
|
};
|
||||||
use pyo3::exceptions::PyValueError;
|
use pyo3::exceptions::PyValueError;
|
||||||
use pyo3::prelude::*;
|
use pyo3::prelude::*;
|
||||||
|
|
||||||
|
|
||||||
macro_rules! impl_enum_into_py_object {
|
macro_rules! impl_enum_into_py_object {
|
||||||
($($s:ident: $t:ty $(,)?)*) => {
|
($($s:ident: $t:ty $(,)?)*) => {
|
||||||
$(
|
$(
|
||||||
@@ -28,7 +27,7 @@ macro_rules! impl_enum_into_py_object {
|
|||||||
/// convert a value between units
|
/// convert a value between units
|
||||||
fn convert(&self, unit: &str, value: f64) -> PyResult<f64> {
|
fn convert(&self, unit: &str, value: f64) -> PyResult<f64> {
|
||||||
match unit.parse() {
|
match unit.parse() {
|
||||||
Ok(unit) => Ok(self.inner.convert(&unit, value)?),
|
Ok(unit) => Ok(self.inner.convert(&unit, value).map_err(|e| PyErr::new::<PyValueError, _>(format!("{}", e)))?),
|
||||||
Err(_) => Err(PyErr::new::<PyValueError, _>(format!("Invalid unit: {}", unit)))
|
Err(_) => Err(PyErr::new::<PyValueError, _>(format!("Invalid unit: {}", unit)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,7 +86,8 @@ fn ome_metadata_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|||||||
|
|
||||||
#[pyfn(m)]
|
#[pyfn(m)]
|
||||||
fn ome(text: &str) -> PyResult<Ome> {
|
fn ome(text: &str) -> PyResult<Ome> {
|
||||||
Ok(text.parse()?)
|
text.parse()
|
||||||
|
.map_err(|e| PyErr::new::<PyValueError, _>(format!("{}", e)))
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user