ndaxrs 0.1.0

Rust client library for the NDAX cryptocurrency exchange API
Documentation
// Copyright (C) 2026 ndaxrs Art Morozov
// SPDX-License-Identifier: GPL-3.0-only

//! Error types for the ndaxrs crate.

use displaydoc::Display;

/// Result type alias for ndaxrs operations.
pub type Result<T> = std::result::Result<T, Error>;

/// Error type for ndaxrs operations.
#[derive(Debug, Display)]
#[non_exhaustive]
pub enum Error {
  /// WebSocket error: {0}
  WebSocket(Box<tokio_tungstenite::tungstenite::Error>),
  /// JSON serialization error: {0}
  Json(serde_json::Error),
  /// URL parse error: {0}
  Url(url::ParseError),
  /// Environment variable error: {0}
  Env(String),
  /// IO error: {0}
  Io(std::io::Error),
  /// Missing credentials required for authenticated API
  MissingCredentials,
  /// Authentication failed: {0}
  AuthFailed(String),
  /// NDAX API error (code {0}): {1}
  NdaxError(i32, String),
  /// Request timeout
  Timeout,
  /// Connection closed
  ConnectionClosed,
}

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

impl From<tokio_tungstenite::tungstenite::Error> for Error {
  fn from(err: tokio_tungstenite::tungstenite::Error) -> Self {
    Error::WebSocket(Box::new(err))
  }
}

impl From<serde_json::Error> for Error {
  fn from(err: serde_json::Error) -> Self { Error::Json(err) }
}

impl From<url::ParseError> for Error {
  fn from(err: url::ParseError) -> Self { Error::Url(err) }
}

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

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

  #[test]
  fn test_error_display() {
    let err = Error::MissingCredentials;
    assert_eq!(
      format!("{}", err),
      "Missing credentials required for authenticated API"
    );

    let err = Error::NdaxError(100, "Invalid request".to_string());
    assert_eq!(
      format!("{}", err),
      "NDAX API error (code 100): Invalid request"
    );

    let err = Error::Timeout;
    assert_eq!(format!("{}", err), "Request timeout");

    let err = Error::ConnectionClosed;
    assert_eq!(format!("{}", err), "Connection closed");

    let err = Error::AuthFailed("bad signature".to_string());
    assert_eq!(format!("{}", err), "Authentication failed: bad signature");

    let err = Error::Env("NDAX_API_KEY not set".to_string());
    assert_eq!(
      format!("{}", err),
      "Environment variable error: NDAX_API_KEY not set"
    );
  }
}