bip329 0.4.0

A library for working with BIP329 labels
Documentation
use serde::{Deserialize as _, Deserializer};
pub(crate) fn deserialize_string_or_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
where
    D: Deserializer<'de>,
{
    #[derive(serde::Deserialize)]
    #[serde(untagged)]
    enum StringOrBool {
        String(String),
        Bool(bool),
    }

    match StringOrBool::deserialize(deserializer)? {
        StringOrBool::Bool(b) => Ok(b),
        StringOrBool::String(s) => match s.to_ascii_lowercase().as_str() {
            "true" => Ok(true),
            "false" => Ok(false),
            string => {
                let msg = format!("Invalid boolean string: {string}");
                Err(serde::de::Error::custom(msg))
            }
        },
    }
}