soda_sol 0.1.1

Generates Solana Projects from an IDL
Documentation
use std::sync::{MutexGuard, PoisonError};

#[derive(thiserror::Error, Debug)]
pub enum Error {
    #[error("soda_sol crate error: {message}")]
    CustomError { message: String },
}
#[derive(serde::Serialize, serde::Deserialize)]
struct ErrorWrapper {
    error: String,
}
impl serde::Serialize for Error {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::ser::Serializer,
    {
        let error_message = match self {
            Error::CustomError { message } => message,
        };
        let wrapper = ErrorWrapper {
            error: error_message.to_string(),
        };
        wrapper.serialize(serializer)
    }
}

impl<'de> serde::Deserialize<'de> for Error {
    fn deserialize<D>(deserializer: D) -> Result<Error, D::Error>
    where
        D: serde::de::Deserializer<'de>,
    {
        let wrapper = ErrorWrapper::deserialize(deserializer)?;
        Ok(Error::CustomError {
            message: wrapper.error,
        })
    }
}

impl From<bincode::Error> for Error {
    fn from(err: bincode::Error) -> Error {
        Error::CustomError {
            message: err.to_string(),
        }
    }
}

impl From<std::io::Error> for Error {
    fn from(err: std::io::Error) -> Error {
        Error::CustomError {
            message: err.to_string(),
        }
    }
}

impl From<Result<(), std::io::Error>> for Error {
    fn from(err: Result<(), std::io::Error>) -> Error {
        match err {
            Ok(_) => Error::CustomError {
                message: "no error".to_string(),
            },
            Err(err) => Error::CustomError {
                message: err.to_string(),
            },
        }
    }
}

impl From<serde_json::Error> for Error {
    fn from(err: serde_json::Error) -> Error {
        Error::CustomError {
            message: err.to_string(),
        }
    }
}

impl From<handlebars::RenderError> for Error {
    fn from(err: handlebars::RenderError) -> Error {
        Error::CustomError {
            message: err.to_string(),
        }
    }
}

impl<T> From<PoisonError<MutexGuard<'_, T>>> for Error {
    fn from(err: PoisonError<MutexGuard<'_, T>>) -> Error {
        Error::CustomError {
            message: err.to_string(),
        }
    }
}