hyperliquid 0.2.4

A Rust library for the Hyperliquid API
Documentation
use std::collections::HashMap;

use crate::{
    client::Client,
    config::Config,
    exchange::Exchange,
    info::Info,
    types::{Chain, API},
    Websocket,
};

impl From<&API> for String {
    fn from(api: &API) -> Self {
        String::from(match api {
            API::Info => "/info",
            API::Exchange => "/exchange",
        })
    }
}

pub trait Hyperliquid {
    fn new(chain: Chain) -> Self;
    fn new_with_config(chain: Chain, config: &Config) -> Self;
}

impl Hyperliquid for Info {
    fn new(chain: Chain) -> Self {
        let config = match chain {
            Chain::Arbitrum => Config::mainnet(),
            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
            _ => Config::default(),
        };
        Self::new_with_config(chain, &config)
    }
    fn new_with_config(chain: Chain, config: &Config) -> Self {
        Self {
            chain,
            client: Client::new(config.rest_endpoint.clone()),
        }
    }
}

impl Hyperliquid for Exchange {
    fn new(chain: Chain) -> Self {
        let config = match chain {
            Chain::Arbitrum => Config::mainnet(),
            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
            _ => Config::default(),
        };
        Self::new_with_config(chain, &config)
    }
    fn new_with_config(chain: Chain, config: &Config) -> Self {
        Self {
            chain,
            client: Client::new(config.rest_endpoint.clone()),
        }
    }
}

impl Hyperliquid for Websocket {
    fn new(chain: Chain) -> Self {
        let config = match chain {
            Chain::Arbitrum => Config::mainnet(),
            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
            _ => Config::default(),
        };
        Self::new_with_config(chain, &config)
    }
    fn new_with_config(_chain: Chain, config: &Config) -> Self {
        Self {
            url: config.ws_endpoint.clone(),
            stream: None,
            channels: HashMap::new(),
        }
    }
}