hyperliquid/
api.rs

1use std::collections::HashMap;
2
3use crate::{
4    client::Client,
5    config::Config,
6    exchange::Exchange,
7    info::Info,
8    types::{Chain, API},
9    Websocket,
10};
11
12impl From<&API> for String {
13    fn from(api: &API) -> Self {
14        String::from(match api {
15            API::Info => "/info",
16            API::Exchange => "/exchange",
17        })
18    }
19}
20
21pub trait Hyperliquid {
22    fn new(chain: Chain) -> Self;
23    fn new_with_config(chain: Chain, config: &Config) -> Self;
24}
25
26impl Hyperliquid for Info {
27    fn new(chain: Chain) -> Self {
28        let config = match chain {
29            Chain::Arbitrum => Config::mainnet(),
30            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
31            _ => Config::default(),
32        };
33        Self::new_with_config(chain, &config)
34    }
35    fn new_with_config(chain: Chain, config: &Config) -> Self {
36        Self {
37            chain,
38            client: Client::new(config.rest_endpoint.clone()),
39        }
40    }
41}
42
43impl Hyperliquid for Exchange {
44    fn new(chain: Chain) -> Self {
45        let config = match chain {
46            Chain::Arbitrum => Config::mainnet(),
47            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
48            _ => Config::default(),
49        };
50        Self::new_with_config(chain, &config)
51    }
52    fn new_with_config(chain: Chain, config: &Config) -> Self {
53        Self {
54            chain,
55            client: Client::new(config.rest_endpoint.clone()),
56        }
57    }
58}
59
60impl Hyperliquid for Websocket {
61    fn new(chain: Chain) -> Self {
62        let config = match chain {
63            Chain::Arbitrum => Config::mainnet(),
64            Chain::ArbitrumGoerli | Chain::ArbitrumTestnet => Config::testnet(),
65            _ => Config::default(),
66        };
67        Self::new_with_config(chain, &config)
68    }
69    fn new_with_config(_chain: Chain, config: &Config) -> Self {
70        Self {
71            url: config.ws_endpoint.clone(),
72            stream: None,
73            channels: HashMap::new(),
74        }
75    }
76}