iab-specs-core 0.5.1

Core types, traits, and error handling for the iab-specs ecosystem. Provides the Extension trait, error types, and shared utilities used by all iab-specs sub-crates.
Documentation
use std::result;
use thiserror::Error;

#[derive(Error, Debug)]
pub enum Error {
    #[error("{0}")]
    UninitializedFieldError(&'static str),

    #[cfg(feature = "serde_json")]
    #[error("{0}")]
    SerdeJsonError(#[from] serde_json::Error),

    #[error("{0}")]
    SerdePlainError(#[from] serde_plain::Error),

    #[error("{0}")]
    StdFmtError(#[from] std::fmt::Error),

    #[error("Invalid transition from '{from}' to '{to}'")]
    InvalidTransition { from: String, to: String },
}

impl From<derive_builder::UninitializedFieldError> for Error {
    fn from(e: derive_builder::UninitializedFieldError) -> Self {
        Self::UninitializedFieldError(e.field_name())
    }
}

/// Alias for a `Result` with the error type `iab_specs_core::Error`.
pub type Result<T> = result::Result<T, Error>;

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_uninitialized_field_error() {
        let err = Error::UninitializedFieldError("test_field");
        assert_eq!(err.to_string(), "test_field");
    }

    #[cfg(feature = "serde_json")]
    #[test]
    fn test_serde_json_error() {
        let json_err = serde_json::from_str::<serde_json::Value>("invalid json");
        assert!(json_err.is_err());
        let err: Error = json_err.unwrap_err().into();
        assert!(err.to_string().contains("expected value"));
    }

    #[test]
    fn test_serde_plain_error() {
        use serde::de::Error as _;
        let plain_err = serde_plain::Error::custom("custom error");
        let err: Error = plain_err.into();
        assert_eq!(err.to_string(), "custom error");
    }

    #[test]
    fn test_from_builder_uninitialized_field_error() {
        use derive_builder::UninitializedFieldError;
        let builder_err = UninitializedFieldError::new("field_name");
        let err: Error = builder_err.into();
        assert_eq!(err.to_string(), "field_name");
    }

    #[test]
    fn test_invalid_transition() {
        let err = Error::InvalidTransition {
            from: "pending".to_string(),
            to: "completed".to_string(),
        };
        assert_eq!(
            err.to_string(),
            "Invalid transition from 'pending' to 'completed'"
        );
    }
}