Skip to content

Commit 6d9ab09

Browse files
authored
Merge pull request #32 from joaquinbejar/M1/issue-12-block-trade-channels
feat: add block trade subscription channels
2 parents 5e07688 + 02ba0a1 commit 6d9ab09

File tree

5 files changed

+184
-1
lines changed

5 files changed

+184
-1
lines changed

src/client.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,11 @@ impl DeribitWebSocketClient {
10081008
| ["deribit_price_statistics", index_name]
10091009
| ["deribit_volatility_index", index_name] => Some(index_name.to_string()),
10101010
["instrument", "state", _kind, currency] => Some(currency.to_string()),
1011-
["platform_state"] | ["platform_state", "public_methods_state"] => None,
1011+
["block_rfq", "trades", currency] => Some(currency.to_string()),
1012+
["block_trade_confirmations", currency] => Some(currency.to_string()),
1013+
["platform_state"]
1014+
| ["platform_state", "public_methods_state"]
1015+
| ["block_trade_confirmations"] => None,
10121016
_ => None,
10131017
}
10141018
}

src/constants.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,8 @@ pub mod channels {
122122
pub const MARKPRICE_OPTIONS: &str = "markprice.options";
123123
/// Quote channel
124124
pub const QUOTE: &str = "quote";
125+
/// Block RFQ trades channel
126+
pub const BLOCK_RFQ_TRADES: &str = "block_rfq.trades";
127+
/// Block trade confirmations channel
128+
pub const BLOCK_TRADE_CONFIRMATIONS: &str = "block_trade_confirmations";
125129
}

src/model/subscription.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,16 @@ impl SubscriptionManager {
7272
| SubscriptionChannel::Quote(inst) => Some(inst.clone()),
7373
SubscriptionChannel::Perpetual { instrument, .. } => Some(instrument.clone()),
7474
SubscriptionChannel::InstrumentState { currency, .. } => Some(currency.clone()),
75+
SubscriptionChannel::BlockRfqTrades(currency)
76+
| SubscriptionChannel::BlockTradeConfirmationsByCurrency(currency) => {
77+
Some(currency.clone())
78+
}
7579
SubscriptionChannel::UserOrders
7680
| SubscriptionChannel::UserTrades
7781
| SubscriptionChannel::UserPortfolio
7882
| SubscriptionChannel::PlatformState
7983
| SubscriptionChannel::PlatformStatePublicMethods
84+
| SubscriptionChannel::BlockTradeConfirmations
8085
| SubscriptionChannel::Unknown(_) => None,
8186
};
8287
self.add_subscription(channel, channel_type, instrument);

src/model/ws_types.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,12 @@ pub enum SubscriptionChannel {
194194
PriceStatistics(String),
195195
/// Volatility index data
196196
VolatilityIndex(String),
197+
/// Block RFQ trades for a specific currency
198+
BlockRfqTrades(String),
199+
/// Block trade confirmations (all currencies)
200+
BlockTradeConfirmations,
201+
/// Block trade confirmations for a specific currency
202+
BlockTradeConfirmationsByCurrency(String),
197203
/// Unknown or unrecognized channel
198204
Unknown(String),
199205
}
@@ -340,6 +346,13 @@ impl SubscriptionChannel {
340346
SubscriptionChannel::VolatilityIndex(index_name) => {
341347
format!("deribit_volatility_index.{}", index_name)
342348
}
349+
SubscriptionChannel::BlockRfqTrades(currency) => {
350+
format!("block_rfq.trades.{}", currency)
351+
}
352+
SubscriptionChannel::BlockTradeConfirmations => "block_trade_confirmations".to_string(),
353+
SubscriptionChannel::BlockTradeConfirmationsByCurrency(currency) => {
354+
format!("block_trade_confirmations.{}", currency)
355+
}
343356
SubscriptionChannel::Unknown(channel) => channel.clone(),
344357
}
345358
}
@@ -426,6 +439,13 @@ impl SubscriptionChannel {
426439
["deribit_volatility_index", index_name] => {
427440
SubscriptionChannel::VolatilityIndex(index_name.to_string())
428441
}
442+
["block_rfq", "trades", currency] => {
443+
SubscriptionChannel::BlockRfqTrades(currency.to_string())
444+
}
445+
["block_trade_confirmations"] => SubscriptionChannel::BlockTradeConfirmations,
446+
["block_trade_confirmations", currency] => {
447+
SubscriptionChannel::BlockTradeConfirmationsByCurrency(currency.to_string())
448+
}
429449
_ => SubscriptionChannel::Unknown(s.to_string()),
430450
}
431451
}

tests/unit/subscription_channel.rs

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,3 +774,153 @@ fn test_trades_by_kind_equality() {
774774
assert_eq!(channel1, channel2);
775775
assert_ne!(channel1, channel3);
776776
}
777+
778+
// =============================================================================
779+
// Tests for block trade subscription channels (Issue #12)
780+
// =============================================================================
781+
782+
// Test block_rfq.trades channel parsing
783+
#[test]
784+
fn test_parse_channel_block_rfq_trades() {
785+
let channel = SubscriptionChannel::from_string("block_rfq.trades.BTC");
786+
assert!(
787+
matches!(channel, SubscriptionChannel::BlockRfqTrades(ref currency) if currency == "BTC")
788+
);
789+
}
790+
791+
#[test]
792+
fn test_parse_channel_block_rfq_trades_eth() {
793+
let channel = SubscriptionChannel::from_string("block_rfq.trades.ETH");
794+
assert!(
795+
matches!(channel, SubscriptionChannel::BlockRfqTrades(ref currency) if currency == "ETH")
796+
);
797+
}
798+
799+
// Test block_trade_confirmations channel parsing
800+
#[test]
801+
fn test_parse_channel_block_trade_confirmations() {
802+
let channel = SubscriptionChannel::from_string("block_trade_confirmations");
803+
assert!(matches!(
804+
channel,
805+
SubscriptionChannel::BlockTradeConfirmations
806+
));
807+
}
808+
809+
#[test]
810+
fn test_parse_channel_block_trade_confirmations_by_currency() {
811+
let channel = SubscriptionChannel::from_string("block_trade_confirmations.BTC");
812+
assert!(matches!(
813+
channel,
814+
SubscriptionChannel::BlockTradeConfirmationsByCurrency(ref currency) if currency == "BTC"
815+
));
816+
}
817+
818+
#[test]
819+
fn test_parse_channel_block_trade_confirmations_by_currency_eth() {
820+
let channel = SubscriptionChannel::from_string("block_trade_confirmations.ETH");
821+
assert!(matches!(
822+
channel,
823+
SubscriptionChannel::BlockTradeConfirmationsByCurrency(ref currency) if currency == "ETH"
824+
));
825+
}
826+
827+
// Test channel_name for block trade channels
828+
#[test]
829+
fn test_channel_name_block_rfq_trades() {
830+
let channel = SubscriptionChannel::BlockRfqTrades("BTC".to_string());
831+
assert_eq!(channel.channel_name(), "block_rfq.trades.BTC");
832+
}
833+
834+
#[test]
835+
fn test_channel_name_block_rfq_trades_eth() {
836+
let channel = SubscriptionChannel::BlockRfqTrades("ETH".to_string());
837+
assert_eq!(channel.channel_name(), "block_rfq.trades.ETH");
838+
}
839+
840+
#[test]
841+
fn test_channel_name_block_trade_confirmations() {
842+
let channel = SubscriptionChannel::BlockTradeConfirmations;
843+
assert_eq!(channel.channel_name(), "block_trade_confirmations");
844+
}
845+
846+
#[test]
847+
fn test_channel_name_block_trade_confirmations_by_currency() {
848+
let channel = SubscriptionChannel::BlockTradeConfirmationsByCurrency("BTC".to_string());
849+
assert_eq!(channel.channel_name(), "block_trade_confirmations.BTC");
850+
}
851+
852+
#[test]
853+
fn test_channel_name_block_trade_confirmations_by_currency_eth() {
854+
let channel = SubscriptionChannel::BlockTradeConfirmationsByCurrency("ETH".to_string());
855+
assert_eq!(channel.channel_name(), "block_trade_confirmations.ETH");
856+
}
857+
858+
// Test is_unknown for block trade channels
859+
#[test]
860+
fn test_is_unknown_block_rfq_trades() {
861+
let channel = SubscriptionChannel::BlockRfqTrades("BTC".to_string());
862+
assert!(!channel.is_unknown());
863+
}
864+
865+
#[test]
866+
fn test_is_unknown_block_trade_confirmations() {
867+
let channel = SubscriptionChannel::BlockTradeConfirmations;
868+
assert!(!channel.is_unknown());
869+
}
870+
871+
#[test]
872+
fn test_is_unknown_block_trade_confirmations_by_currency() {
873+
let channel = SubscriptionChannel::BlockTradeConfirmationsByCurrency("BTC".to_string());
874+
assert!(!channel.is_unknown());
875+
}
876+
877+
// Test equality for block trade channels
878+
#[test]
879+
fn test_block_rfq_trades_equality() {
880+
let channel1 = SubscriptionChannel::BlockRfqTrades("BTC".to_string());
881+
let channel2 = SubscriptionChannel::BlockRfqTrades("BTC".to_string());
882+
let channel3 = SubscriptionChannel::BlockRfqTrades("ETH".to_string());
883+
assert_eq!(channel1, channel2);
884+
assert_ne!(channel1, channel3);
885+
}
886+
887+
#[test]
888+
fn test_block_trade_confirmations_equality() {
889+
let channel1 = SubscriptionChannel::BlockTradeConfirmations;
890+
let channel2 = SubscriptionChannel::BlockTradeConfirmations;
891+
assert_eq!(channel1, channel2);
892+
}
893+
894+
#[test]
895+
fn test_block_trade_confirmations_by_currency_equality() {
896+
let channel1 = SubscriptionChannel::BlockTradeConfirmationsByCurrency("BTC".to_string());
897+
let channel2 = SubscriptionChannel::BlockTradeConfirmationsByCurrency("BTC".to_string());
898+
let channel3 = SubscriptionChannel::BlockTradeConfirmationsByCurrency("ETH".to_string());
899+
assert_eq!(channel1, channel2);
900+
assert_ne!(channel1, channel3);
901+
}
902+
903+
// Test roundtrip for block trade channels
904+
#[test]
905+
fn test_block_rfq_trades_roundtrip() {
906+
let original = SubscriptionChannel::BlockRfqTrades("BTC".to_string());
907+
let channel_name = original.channel_name();
908+
let parsed = SubscriptionChannel::from_string(&channel_name);
909+
assert_eq!(original, parsed);
910+
}
911+
912+
#[test]
913+
fn test_block_trade_confirmations_roundtrip() {
914+
let original = SubscriptionChannel::BlockTradeConfirmations;
915+
let channel_name = original.channel_name();
916+
let parsed = SubscriptionChannel::from_string(&channel_name);
917+
assert_eq!(original, parsed);
918+
}
919+
920+
#[test]
921+
fn test_block_trade_confirmations_by_currency_roundtrip() {
922+
let original = SubscriptionChannel::BlockTradeConfirmationsByCurrency("BTC".to_string());
923+
let channel_name = original.channel_name();
924+
let parsed = SubscriptionChannel::from_string(&channel_name);
925+
assert_eq!(original, parsed);
926+
}

0 commit comments

Comments
 (0)