refactor(data): simplify

This commit is contained in:
Nova
2022-11-05 17:56:34 -04:00
parent cffb968d2e
commit 2b4a495c07

View File

@@ -17,9 +17,9 @@ use stardust_xr::values::Transform;
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
static PULSE_SENDER_REGISTRY: Registry<PulseSender> = Registry::new(); static PULSE_SENDER_REGISTRY: Registry<PulseSender> = Registry::new();
static PULSE_RECEIVER_REGISTRY: Registry<PulseReceiver> = Registry::new(); pub static PULSE_RECEIVER_REGISTRY: Registry<PulseReceiver> = Registry::new();
fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool { pub fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool {
(|| -> Result<_> { (|| -> Result<_> {
for key in mask_map_lesser.get_mask()?.iter_keys() { for key in mask_map_lesser.get_mask()?.iter_keys() {
let lesser_key_type = mask_map_lesser.get_mask()?.index(key)?.flexbuffer_type(); let lesser_key_type = mask_map_lesser.get_mask()?.index(key)?.flexbuffer_type();
@@ -33,54 +33,30 @@ fn mask_matches(mask_map_lesser: &Mask, mask_map_greater: &Mask) -> bool {
.is_ok() .is_ok()
} }
type MaskMapGetFn = fn(&[u8]) -> Result<flexbuffers::MapReader<&[u8]>>; pub struct Mask(pub Vec<u8>);
pub struct Mask {
binary: Vec<u8>,
get_fn: MaskMapGetFn,
}
impl Mask { impl Mask {
pub fn get_mask(&self) -> Result<flexbuffers::MapReader<&[u8]>> { pub fn get_mask(&self) -> Result<flexbuffers::MapReader<&[u8]>> {
(self.get_fn)(self.binary.as_slice()) flexbuffers::Reader::get_root(self.0.as_slice())
.map_err(|_| anyhow!("Mask is not a valid flexbuffer"))?
.get_map()
.map_err(|_| anyhow!("Mask is not a valid map"))
} }
// pub fn set_mask(&mut self, binary: Vec<u8>, get_fn: MaskMapGetFn) {
// self.binary = binary;
// self.get_fn = get_fn;
// }
} }
// impl Default for Mask {
// fn default() -> Self { #[derive(Serialize, Deserialize)]
// Mask { struct SendDataInfo<'a> {
// binary: Default::default(), uid: &'a str,
// get_fn: mask_get_err, data: Vec<u8>,
// }
// }
// }
// fn mask_get_err(_binary: &[u8]) -> Result<flexbuffers::MapReader<&[u8]>> {
// Err(anyhow!("You need to call setMask to set the mask!"))
// }
fn mask_get_map_at_root(binary: &[u8]) -> Result<flexbuffers::MapReader<&[u8]>> {
flexbuffers::Reader::get_root(binary)
.map_err(|_| anyhow!("Mask is not a valid flexbuffer"))?
.get_map()
.map_err(|_| anyhow!("Mask is not a valid map"))
} }
// pub fn mask_get_map_send_data(binary: &[u8]) -> Result<flexbuffers::MapReader<&[u8]>> {
// flexbuffers::Reader::get_root(binary)
// .map_err(|_| anyhow!("Mask is not a valid flexbuffer"))?
// .get_vector()?
// .index(1)?
// .get_map()
// .map_err(|_| anyhow!("Mask is not a valid map"))
// }
pub struct PulseSender { pub struct PulseSender {
uid: String, uid: String,
node: Weak<Node>, node: Weak<Node>,
mask: Mask, pub mask: Mask,
aliases: LifeLinkedNodeMap<String>, aliases: LifeLinkedNodeMap<String>,
} }
impl PulseSender { impl PulseSender {
fn add_to(node: &Arc<Node>, mask: Mask) -> Result<()> { pub fn add_to(node: &Arc<Node>, mask: Mask) -> Result<Arc<PulseSender>> {
ensure!( ensure!(
node.spatial.get().is_some(), node.spatial.get().is_some(),
"Internal: Node does not have a spatial attached!" "Internal: Node does not have a spatial attached!"
@@ -99,7 +75,7 @@ impl PulseSender {
for receiver in PULSE_RECEIVER_REGISTRY.get_valid_contents() { for receiver in PULSE_RECEIVER_REGISTRY.get_valid_contents() {
sender.handle_new_receiver(&receiver); sender.handle_new_receiver(&receiver);
} }
Ok(()) Ok(sender.clone())
} }
fn handle_new_receiver(&self, receiver: &PulseReceiver) { fn handle_new_receiver(&self, receiver: &PulseReceiver) {
if !mask_matches(&self.mask, &receiver.mask) { if !mask_matches(&self.mask, &receiver.mask) {
@@ -181,35 +157,24 @@ impl PulseSender {
} }
fn send_data_flex(node: &Node, calling_client: Arc<Client>, data: &[u8]) -> Result<()> { fn send_data_flex(node: &Node, calling_client: Arc<Client>, data: &[u8]) -> Result<()> {
#[derive(Serialize, Deserialize)]
struct SendDataInfo<'a> {
uid: &'a str,
data: Vec<u8>,
}
let info: SendDataInfo = deserialize(data)?; let info: SendDataInfo = deserialize(data)?;
let capture_path = node.path.clone() + "/" + info.uid; let capture_path = node.path.clone() + "/" + info.uid;
let receiver_node = calling_client.get_node("Pulse receiver", &capture_path)?; let receiver_node = calling_client.get_node("Pulse receiver", &capture_path)?;
let receiver =
receiver_node.get_aspect("Pulse Receiver", "pulse receiver", |n| &n.pulse_receiver)?;
let receiver_mask = &receiver_node let receiver_mask = &receiver_node
.get_aspect("Pulse receiver", "pulse receiver", |node| { .get_aspect("Pulse receiver", "pulse receiver", |node| {
&node.pulse_receiver &node.pulse_receiver
})? })?
.mask; .mask;
let data_mask = Mask {
binary: info.data, let data_mask = Mask(info.data);
get_fn: mask_get_map_at_root,
};
data_mask.get_mask()?; data_mask.get_mask()?;
ensure!( ensure!(
mask_matches(receiver_mask, &data_mask), mask_matches(receiver_mask, &data_mask),
"Message does not contain the same keys as the receiver's mask" "Message does not contain the same keys as the receiver's mask"
); );
receiver_node.send_remote_signal( receiver.send_data(&node.pulse_sender.get().unwrap().uid, data_mask.0)
"data",
&serialize(SendDataInfo {
uid: &node.pulse_sender.get().unwrap().uid,
data: data_mask.binary,
})?,
)
} }
} }
impl Drop for PulseSender { impl Drop for PulseSender {
@@ -220,9 +185,9 @@ impl Drop for PulseSender {
pub struct PulseReceiver { pub struct PulseReceiver {
uid: String, uid: String,
node: Weak<Node>, pub node: Weak<Node>,
field: Arc<Field>, pub field: Arc<Field>,
mask: Mask, pub mask: Mask,
} }
impl PulseReceiver { impl PulseReceiver {
pub fn add_to(node: &Arc<Node>, field: Arc<Field>, mask: Mask) -> Result<()> { pub fn add_to(node: &Arc<Node>, field: Arc<Field>, mask: Mask) -> Result<()> {
@@ -245,6 +210,13 @@ impl PulseReceiver {
let _ = node.pulse_receiver.set(receiver); let _ = node.pulse_receiver.set(receiver);
Ok(()) Ok(())
} }
pub fn send_data(&self, uid: &str, data: Vec<u8>) -> Result<()> {
if let Some(node) = self.node.upgrade() {
node.send_remote_signal("data", &serialize(SendDataInfo { uid, data })?)?;
}
Ok(())
}
} }
impl Drop for PulseReceiver { impl Drop for PulseReceiver {
@@ -263,14 +235,6 @@ pub fn create_interface(client: &Arc<Client>) {
node.add_to_scenegraph(); node.add_to_scenegraph();
} }
// pub fn mask_get_map_pulse_sender(binary: &[u8]) -> Result<flexbuffers::MapReader<&[u8]>> {
// flexbuffers::Reader::get_root(binary)
// .map_err(|_| anyhow!("Mask is not a valid flexbuffer"))?
// .get_vector()?
// .index(3)?
// .get_map()
// .map_err(|_| anyhow!("Mask is not a valid map"))
// }
pub fn create_pulse_sender_flex( pub fn create_pulse_sender_flex(
_node: &Node, _node: &Node,
calling_client: Arc<Client>, calling_client: Arc<Client>,
@@ -288,10 +252,7 @@ pub fn create_pulse_sender_flex(
let parent = find_spatial_parent(&calling_client, info.parent_path)?; let parent = find_spatial_parent(&calling_client, info.parent_path)?;
let transform = parse_transform(info.transform, true, true, false)?; let transform = parse_transform(info.transform, true, true, false)?;
let mask = Mask { let mask = Mask(info.mask);
binary: info.mask,
get_fn: mask_get_map_at_root,
};
mask.get_mask()?; mask.get_mask()?;
let node = node.add_to_scenegraph(); let node = node.add_to_scenegraph();
@@ -300,14 +261,6 @@ pub fn create_pulse_sender_flex(
Ok(()) Ok(())
} }
// pub fn mask_get_map_pulse_receiver(binary: &[u8]) -> Result<flexbuffers::MapReader<&[u8]>> {
// flexbuffers::Reader::get_root(binary)
// .map_err(|_| anyhow!("Mask is not a valid flexbuffer"))?
// .get_vector()?
// .index(4)?
// .get_map()
// .map_err(|_| anyhow!("Mask is not a valid map"))
// }
pub fn create_pulse_receiver_flex( pub fn create_pulse_receiver_flex(
_node: &Node, _node: &Node,
calling_client: Arc<Client>, calling_client: Arc<Client>,
@@ -326,10 +279,7 @@ pub fn create_pulse_receiver_flex(
let parent = find_spatial_parent(&calling_client, info.parent_path)?; let parent = find_spatial_parent(&calling_client, info.parent_path)?;
let transform = parse_transform(info.transform, true, true, false)?; let transform = parse_transform(info.transform, true, true, false)?;
let field = find_field(&calling_client, info.field_path)?; let field = find_field(&calling_client, info.field_path)?;
let mask = Mask { let mask = Mask(info.mask);
binary: info.mask,
get_fn: mask_get_map_at_root,
};
mask.get_mask()?; mask.get_mask()?;
let node = node.add_to_scenegraph(); let node = node.add_to_scenegraph();