error.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. use crate::Error;
  2. use quote::quote;
  3. pub fn generate(error: Error) -> proc_macro2::TokenStream {
  4. let error_enum = error.raw_enum;
  5. let enum_name = &error.ident;
  6. quote! {
  7. #[derive(thiserror::Error, Debug)]
  8. pub enum Error {
  9. #[error(transparent)]
  10. ProgramError(#[from] ProgramError),
  11. #[error("{0:?}")]
  12. ErrorCode(#[from] #enum_name),
  13. }
  14. #[derive(Debug, Clone, Copy)]
  15. #[repr(u32)]
  16. #error_enum
  17. impl std::fmt::Display for #enum_name {
  18. fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
  19. <Self as std::fmt::Debug>::fmt(self, fmt)
  20. }
  21. }
  22. impl std::error::Error for #enum_name {}
  23. impl std::convert::From<Error> for ProgramError {
  24. fn from(e: Error) -> ProgramError {
  25. // Errors 0-100 are reserved for the framework.
  26. let error_offset = 100u32;
  27. match e {
  28. Error::ProgramError(e) => e,
  29. Error::ErrorCode(c) => ProgramError::Custom(c as u32 + error_offset),
  30. }
  31. }
  32. }
  33. }
  34. }