use crate::providers::deribit;
const NORMALIZE_SEAMS: u8 = 3;
pub fn provider_normalize(data: &[u8]) {
let Some((selector, payload)) = data.split_first() else {
return;
};
match selector % NORMALIZE_SEAMS {
0 => deribit::fuzz_normalize_ticker(payload),
1 => deribit::fuzz_normalize_book(payload),
_ => deribit::fuzz_instrument_key_from_name(payload),
}
}
#[cfg(test)]
mod tests {
use super::*;
const TICKER_NORMAL: &[u8] =
include_bytes!("../tests/fixtures/deribit/ticker/ticker_normal.json");
const TICKER_NON_FINITE: &[u8] =
include_bytes!("../tests/fixtures/deribit/ticker/ticker_non_finite.json");
const TICKER_CROSSED: &[u8] =
include_bytes!("../tests/fixtures/deribit/ticker/ticker_crossed.json");
const BOOK_GROUPED: &[u8] =
include_bytes!("../tests/fixtures/deribit/book/book_grouped_snapshot.json");
fn with_selector(seam: u8, payload: &[u8]) -> Vec<u8> {
let mut v = Vec::with_capacity(payload.len().saturating_add(1));
v.push(seam);
v.extend_from_slice(payload);
v
}
#[test]
fn test_provider_normalize_survives_the_committed_fixtures() {
for seam in 0..=(NORMALIZE_SEAMS + 1) {
for payload in [
TICKER_NORMAL,
TICKER_NON_FINITE,
TICKER_CROSSED,
BOOK_GROUPED,
] {
provider_normalize(&with_selector(seam, payload));
}
}
}
#[test]
fn test_provider_normalize_survives_degenerate_inputs() {
provider_normalize(&[]);
provider_normalize(&[0]);
provider_normalize(&[1]);
provider_normalize(&[2]);
provider_normalize(&with_selector(0, b"not json"));
provider_normalize(&with_selector(1, b"\xff\x00\xfe"));
provider_normalize(&with_selector(2, b"BTC-27JUN25-60000-C"));
provider_normalize(&with_selector(2, b"garbage-name"));
}
}