rezvrh_scraper 0.1.6

Bakalari scraper
Documentation
use serde::{de::IntoDeserializer, Deserialize};

pub fn empty_string_as_none<'de, D, T>(de: D) -> Result<Option<T>, D::Error>
where
    D: serde::Deserializer<'de>,
    T: serde::Deserialize<'de>,
{
    let opt = Option::<String>::deserialize(de)?;
    let opt = opt.as_deref();
    match opt {
        None | Some("") => Ok(None),
        Some(s) => T::deserialize(s.into_deserializer()).map(Some),
    }
}

pub fn single_iter<T, I, E, F>(mut iter: I, err: F) -> Result<T, E>
where
    I: Iterator<Item = T>,
    F: FnOnce() -> E + Copy,
{
    let first = iter.next().ok_or_else(err)?;
    if iter.next().is_some() {
        return Err(err());
    }
    Ok(first)
}