use std::collections::{BTreeMap, HashMap};
use serde::{Deserialize, Serialize};
use crate::{OracleDutyConfig, OracleId, OracleUpdateResult};
pub type ProtocolKeyBytes = [u8; 32];
pub type OracleDutiesMap = BTreeMap<OracleDutiesMapKey, OracleDutiesMapValue>;
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq, Hash)]
pub struct OracleDutiesMapKey {
pub target_commit: u64,
pub oracle_id: OracleId,
}
impl Ord for OracleDutiesMapKey {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.target_commit
.cmp(&other.target_commit)
.then_with(|| self.oracle_id.cmp(&other.oracle_id))
}
}
impl PartialOrd for OracleDutiesMapKey {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
#[derive(Clone, Debug, Serialize, Deserialize, Default)]
pub struct OracleDutiesMapValue {
pub updates: HashMap<ProtocolKeyBytes, Option<OracleUpdateResult>>,
pub config: OracleDutyConfig,
pub retries_made: u32,
}
#[cfg(test)]
mod tests {
use std::cmp::{max, min};
use rialo_s_pubkey::Pubkey;
use super::*;
#[test]
fn test_oracle_duties_map_key_ordering() {
let creator1 = Pubkey::new_unique();
let creator2 = Pubkey::new_unique();
let oracle_id1 = OracleId::new(creator1, "nonce1");
let oracle_id2 = OracleId::new(creator2, "nonce2");
let [oracle_id1, oracle_id2] = [min(oracle_id1, oracle_id2), max(oracle_id1, oracle_id2)];
let key1 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id1,
};
let key2 = OracleDutiesMapKey {
target_commit: 200,
oracle_id: oracle_id1,
};
assert!(key1 < key2);
assert!(key2 > key1);
let key3 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id1,
};
let key4 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id2,
};
assert!(key3 < key4);
assert!(key4 > key3);
let key5 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id2,
};
let key6 = OracleDutiesMapKey {
target_commit: 200,
oracle_id: oracle_id1,
};
assert!(key5 < key6);
assert!(key6 > key5);
let key7 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id1,
};
let key8 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id1,
};
assert_eq!(key7, key8);
assert!(key7 >= key8);
assert!(key7 <= key8);
let mut map = BTreeMap::new();
let key9 = OracleDutiesMapKey {
target_commit: 200,
oracle_id: oracle_id1,
};
let key10 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id2,
};
let key11 = OracleDutiesMapKey {
target_commit: 100,
oracle_id: oracle_id1,
};
map.insert(key9, "first");
map.insert(key10, "second");
map.insert(key11, "third");
let keys: Vec<_> = map.keys().copied().collect();
assert_eq!(keys[0], key11);
assert_eq!(keys[1], key10);
assert_eq!(keys[2], key9);
}
}