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}