use af_sui_types::Address;
use sui_framework_sdk::object::{ID, UID};
use crate::events;
use crate::oracle::PriceFeed;
pub trait Apply<T> {
fn apply(self, target: &mut T);
}
pub trait PriceFeedStorage {
fn insert_price_feed(&mut self, source_wrapper_id: ID, feed: PriceFeed);
fn get_price_feed_mut(&mut self, source_wrapper_id: &ID) -> Option<&mut PriceFeed>;
fn remove_price_feed(&mut self, source_wrapper_id: &ID) -> Option<PriceFeed>;
}
impl<T: PriceFeedStorage> Apply<T> for events::CreatedPriceFeed {
fn apply(self, target: &mut T) {
let Self {
source_wrapper_id,
price,
timestamp,
time_tolerance,
..
} = self;
let feed = PriceFeed {
id: UID {
id: ID {
bytes: Address::ZERO,
},
},
price,
timestamp,
time_tolerance,
};
target.insert_price_feed(source_wrapper_id, feed);
}
}
impl<T: PriceFeedStorage> Apply<T> for events::UpdatedPriceFeed {
fn apply(self, target: &mut T) {
let Self {
source_wrapper_id,
new_price,
new_timestamp,
..
} = self;
if let Some(feed) = target.get_price_feed_mut(&source_wrapper_id) {
feed.price = new_price;
feed.timestamp = new_timestamp;
}
}
}
impl<T: PriceFeedStorage> Apply<T> for events::RemovedPriceFeed {
fn apply(self, target: &mut T) {
let Self {
source_wrapper_id, ..
} = self;
target.remove_price_feed(&source_wrapper_id);
}
}
impl<T: PriceFeedStorage> Apply<T> for events::UpdatedPriceFeedTimeTolerance {
fn apply(self, target: &mut T) {
let Self {
source_wrapper_id,
new_time_tolerance,
..
} = self;
if let Some(feed) = target.get_price_feed_mut(&source_wrapper_id) {
feed.time_tolerance = new_time_tolerance;
}
}
}