rhyperliquid 0.2.0

Rust SDK and client for the Hyperliquid exchange API
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RestingOrder {
    pub oid: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FilledOrder {
    pub total_sz: String,
    pub avg_px: String,
    pub oid: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum OrderStatus {
    Resting { resting: RestingOrder },
    Error { error: String },
    Filled { filled: FilledOrder },
}

impl OrderStatus {
    pub fn is_resting(&self) -> bool {
        matches!(self, Self::Resting { .. })
    }

    pub fn oid(&self) -> Option<u64> {
        match self {
            Self::Resting { resting } => Some(resting.oid),
            Self::Filled { filled } => Some(filled.oid),
            Self::Error { .. } => None,
        }
    }

    pub fn error_message(&self) -> Option<&str> {
        match self {
            Self::Error { error } => Some(error),
            _ => None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CancelStatus {
    Success(String),
    Error { error: String },
}

impl CancelStatus {
    pub fn is_success(&self) -> bool {
        matches!(self, Self::Success(s) if s == "success")
    }

    pub fn error_message(&self) -> Option<&str> {
        match self {
            Self::Error { error } => Some(error),
            Self::Success(_) => None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RunningTwap {
    pub twap_id: u32,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TwapOrderStatus {
    Running { running: RunningTwap },
    Error { error: String },
}

impl TwapOrderStatus {
    pub fn is_running(&self) -> bool {
        matches!(self, Self::Running { .. })
    }

    pub fn twap_id(&self) -> Option<u32> {
        match self {
            Self::Running { running } => Some(running.twap_id),
            Self::Error { .. } => None,
        }
    }

    pub fn error_message(&self) -> Option<&str> {
        match self {
            Self::Error { error } => Some(error),
            Self::Running { .. } => None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TwapCancelStatus {
    Success(String),
    Error { error: String },
}

impl TwapCancelStatus {
    pub fn is_success(&self) -> bool {
        matches!(self, Self::Success(s) if s == "success")
    }

    pub fn error_message(&self) -> Option<&str> {
        match self {
            Self::Error { error } => Some(error),
            Self::Success(_) => None,
        }
    }
}