Skip to main content

deserialize_vec_of_quantities

Function deserialize_vec_of_quantities 

Source
pub fn deserialize_vec_of_quantities<'de, D, T>(
    deserializer: D,
) -> Result<Vec<T>, <D as Deserializer<'de>>::Error>
Expand description

Deserializes a vector of T which implements TryFrom<DynQuantity> from:

  1. A vector representation of DynQuantity or
  2. A string representing a vector of numbers with a unit behind it.

ยงExamples:

use indoc::indoc;
use serde::{Deserialize};
use uom::si::{f64::Length, length::meter};
use dyn_quantity::deserialize_vec_of_quantities;

#[derive(Deserialize, Debug)]
struct VecWrapper {
    #[serde(deserialize_with = "deserialize_vec_of_quantities")]
    vec: Vec<Length>,
}

// Variant 1: Vector representation of `DynQuantity`
let ser = indoc! {"
---
vec: [1 m, 2 mm, 3 km]
"};
let wrapper: VecWrapper = serde_yaml::from_str(&ser).unwrap();
assert_eq!(wrapper.vec[0].get::<meter>(), 1.0);
assert_eq!(wrapper.vec[1].get::<meter>(), 0.002);
assert_eq!(wrapper.vec[2].get::<meter>(), 3000.0);

// Variant 2: Vector of numbers with unit at the end
let ser = indoc! {"
---
vec: '[1, 2e-3, 3e3] m'
"};
let wrapper: VecWrapper = serde_yaml::from_str(&ser).unwrap();
assert_eq!(wrapper.vec[0].get::<meter>(), 1.0);
assert_eq!(wrapper.vec[1].get::<meter>(), 0.002);
assert_eq!(wrapper.vec[2].get::<meter>(), 3000.0);