bifrostlink 0.2.0

Topology-aware RPC library
Documentation
use serde::{Deserialize, Serialize};

use crate::{
	notification, packet::RequestId, route::{MinRttUpdated, Rtt, Via}, AddressT
};

#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct AddForwarded<Address> {
	pub(crate) to: Address,
	pub(crate) rtt: Rtt,
}
notification!((0x0001) AddForwarded<Address: AddressT>);

#[derive(Serialize, Deserialize)]
pub(crate) struct RemoveForwarded<Address> {
	pub(crate) to: Address,
}
notification!((0x0002) RemoveForwarded<Address: AddressT>);

#[derive(Serialize, Deserialize)]
pub struct UpdatedForwardedRtt<Address> {
	pub(crate) to: Address,
	pub(crate) rtt: Rtt,
}
notification!((0x0003) UpdatedForwardedRtt<Address: AddressT>);

impl<Address> MinRttUpdated<Address>
where
	Address: Clone + PartialEq,
{
	pub fn update_for(&self, address: Address) -> Option<UpdatedForwardedRtt<Address>> {
		let via_is_this = Via::Address(address) == self.rtt.via;
		let rtt = if !via_is_this {
			self.rtt.rtt
		} else if let Some(rtt) = self.rtt.second_best {
			rtt
		} else {
			return None;
		};
		let is_updated = if via_is_this {
			self.second_changed
		} else {
			self.first_changed
		};
		if !is_updated {
			return None;
		}
		Some(UpdatedForwardedRtt {
			to: self.for_address.clone(),
			rtt,
		})
	}
}

#[derive(Serialize, Deserialize)]
pub struct CancelRequest {
	pub(crate) rid: RequestId,
}
notification!((0x0004) CancelRequest);