edon 0.0.27

Library embedding Nodejs (libnode) within Rust
Documentation
use std::sync::Arc;

use libnode_sys::constants::LIB_NAME;

pub type Result<T> = std::result::Result<T, Error>;

#[derive(Clone)]
pub enum Error {
  NapiModuleAlreadyRegistered,
  NodejsAlreadyRunning,
  NodejsNotRunning,
  LibnodeNotLoaded,
  LibnodeNotFound,
  LibnodeFailedToLoad,
  LibnodeSymbolNotFound,
  Generic(String),
  IoError(Arc<std::io::Error>),
  NapiError(crate::napi::Error),
}

impl std::fmt::Debug for Error {
  fn fmt(
    &self,
    f: &mut std::fmt::Formatter<'_>,
  ) -> std::fmt::Result {
    match self {
      Self::NapiModuleAlreadyRegistered => write!(f, "NapiModuleAlreadyRegistered"),
      Self::NodejsAlreadyRunning => write!(f, "NodejsAlreadyRunning"),
      Self::NodejsNotRunning => write!(f, "NodejsNotRunning"),
      Self::LibnodeNotLoaded => write!(f, "LibnodeNotLoaded"),
      Self::LibnodeNotFound => write!(f, "{}", self),
      Self::LibnodeFailedToLoad => write!(f, "LibnodeFailedToLoad"),
      Self::LibnodeSymbolNotFound => write!(f, "LibnodeSymbolNotFound"),
      Self::Generic(s) => write!(f, "Generic {}", s),
      Self::IoError(arg0) => f.debug_tuple("IoError").field(arg0).finish(),
      Self::NapiError(arg0) => f.debug_tuple("NapiError").field(arg0).finish(),
    }
  }
}

impl std::fmt::Display for Error {
  fn fmt(
    &self,
    f: &mut std::fmt::Formatter<'_>,
  ) -> std::fmt::Result {
    match self {
      Error::NapiModuleAlreadyRegistered => write!(f, "NapiModuleAlreadyRegistered"),
      Error::NodejsAlreadyRunning => write!(f, "AlreadyRunning"),
      Error::NodejsNotRunning => write!(f, "NotRunning"),
      Error::LibnodeFailedToLoad => write!(f, "LibnodeFailedToLoad"),
      Error::LibnodeNotLoaded => write!(f, "LibnodeNotLoaded"),
      Error::LibnodeSymbolNotFound => write!(f, "LibnodeSymbolNotFound"),
      Error::Generic(s) => write!(f, "Generic {}", s),
      Error::IoError(err) => write!(f, "{}", err),
      Error::NapiError(err) => write!(f, "{}", err),
      Error::LibnodeNotFound => write!(
        f,
        r#"NotFound: {}
How to fix:
    - Specify $EDON_LIBNODE_PATH environment variable
    - Place {} in '<executable_path>/{}'
    - Place {} in '<executable_path>/../lib/{}'
"#,
        LIB_NAME, LIB_NAME, LIB_NAME, LIB_NAME, LIB_NAME
      ),
    }
  }
}

impl Error {
  pub fn generic<S: AsRef<str>>(message: S) -> Self {
    Error::Generic(message.as_ref().to_string())
  }
}

impl std::error::Error for Error {}

impl From<&Error> for Error {
  fn from(value: &Error) -> Self {
    match value {
      Error::NapiModuleAlreadyRegistered => Error::NapiModuleAlreadyRegistered,
      Error::NodejsAlreadyRunning => Error::NodejsAlreadyRunning,
      Error::NodejsNotRunning => Error::NodejsNotRunning,
      Error::LibnodeNotFound => Error::LibnodeNotFound,
      Error::LibnodeNotLoaded => Error::LibnodeNotLoaded,
      Error::LibnodeFailedToLoad => Error::LibnodeFailedToLoad,
      Error::LibnodeSymbolNotFound => Error::LibnodeSymbolNotFound,
      Error::Generic(s) => Error::Generic(s.clone()),
      Error::IoError(error) => Error::IoError(error.clone()),
      Error::NapiError(error) => Error::NapiError(error.clone()),
    }
  }
}

impl From<Error> for std::io::Error {
  fn from(value: Error) -> Self {
    std::io::Error::other(value)
  }
}

impl From<std::io::Error> for Error {
  fn from(value: std::io::Error) -> Self {
    Self::IoError(Arc::new(value))
  }
}

impl From<crate::napi::Error> for Error {
  fn from(value: crate::napi::Error) -> Self {
    Self::NapiError(value)
  }
}