state-res: Pass fetch_event closure as owned F not &F
This commit is contained in:
parent
5085f3b8fe
commit
b8c54d8e2b
@ -61,7 +61,7 @@ impl StateResolution {
|
|||||||
room_version: &RoomVersionId,
|
room_version: &RoomVersionId,
|
||||||
state_sets: &[StateMap<EventId>],
|
state_sets: &[StateMap<EventId>],
|
||||||
auth_events: Vec<Vec<EventId>>,
|
auth_events: Vec<Vec<EventId>>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) -> Result<StateMap<EventId>>
|
) -> Result<StateMap<EventId>>
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
@ -105,7 +105,7 @@ impl StateResolution {
|
|||||||
// Get only the control events with a state_key: "" or ban/kick event (sender != state_key)
|
// Get only the control events with a state_key: "" or ban/kick event (sender != state_key)
|
||||||
let control_events = all_conflicted
|
let control_events = all_conflicted
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|id| is_power_event_id(id, fetch_event))
|
.filter(|id| is_power_event_id(id, &fetch_event))
|
||||||
.cloned()
|
.cloned()
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
@ -113,7 +113,7 @@ impl StateResolution {
|
|||||||
let sorted_control_levels = StateResolution::reverse_topological_power_sort(
|
let sorted_control_levels = StateResolution::reverse_topological_power_sort(
|
||||||
&control_events,
|
&control_events,
|
||||||
&all_conflicted,
|
&all_conflicted,
|
||||||
fetch_event,
|
&fetch_event,
|
||||||
);
|
);
|
||||||
|
|
||||||
debug!("SRTD {:?}", sorted_control_levels);
|
debug!("SRTD {:?}", sorted_control_levels);
|
||||||
@ -124,7 +124,7 @@ impl StateResolution {
|
|||||||
&room_version,
|
&room_version,
|
||||||
&sorted_control_levels,
|
&sorted_control_levels,
|
||||||
&clean,
|
&clean,
|
||||||
fetch_event,
|
&fetch_event,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
debug!("AUTHED {:?}", resolved_control.iter().collect::<Vec<_>>());
|
debug!("AUTHED {:?}", resolved_control.iter().collect::<Vec<_>>());
|
||||||
@ -149,7 +149,7 @@ impl StateResolution {
|
|||||||
debug!("PL {:?}", power_event);
|
debug!("PL {:?}", power_event);
|
||||||
|
|
||||||
let sorted_left_events =
|
let sorted_left_events =
|
||||||
StateResolution::mainline_sort(&events_to_resolve, power_event, fetch_event);
|
StateResolution::mainline_sort(&events_to_resolve, power_event, &fetch_event);
|
||||||
|
|
||||||
debug!("SORTED LEFT {:?}", sorted_left_events.iter().collect::<Vec<_>>());
|
debug!("SORTED LEFT {:?}", sorted_left_events.iter().collect::<Vec<_>>());
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ impl StateResolution {
|
|||||||
&room_version,
|
&room_version,
|
||||||
&sorted_left_events,
|
&sorted_left_events,
|
||||||
&resolved_control, // The control events are added to the final resolved state
|
&resolved_control, // The control events are added to the final resolved state
|
||||||
fetch_event,
|
&fetch_event,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
// Add unconflicted state to the resolved state
|
// Add unconflicted state to the resolved state
|
||||||
@ -234,7 +234,7 @@ impl StateResolution {
|
|||||||
pub fn reverse_topological_power_sort<E, F>(
|
pub fn reverse_topological_power_sort<E, F>(
|
||||||
events_to_sort: &[EventId],
|
events_to_sort: &[EventId],
|
||||||
auth_diff: &BTreeSet<EventId>,
|
auth_diff: &BTreeSet<EventId>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) -> Vec<EventId>
|
) -> Vec<EventId>
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
@ -248,7 +248,7 @@ impl StateResolution {
|
|||||||
&mut graph,
|
&mut graph,
|
||||||
event_id,
|
event_id,
|
||||||
auth_diff,
|
auth_diff,
|
||||||
fetch_event,
|
&fetch_event,
|
||||||
);
|
);
|
||||||
|
|
||||||
// TODO: if these functions are ever made async here
|
// TODO: if these functions are ever made async here
|
||||||
@ -259,7 +259,7 @@ impl StateResolution {
|
|||||||
// This is used in the `key_fn` passed to the lexico_topo_sort fn
|
// This is used in the `key_fn` passed to the lexico_topo_sort fn
|
||||||
let mut event_to_pl = BTreeMap::new();
|
let mut event_to_pl = BTreeMap::new();
|
||||||
for event_id in graph.keys() {
|
for event_id in graph.keys() {
|
||||||
let pl = StateResolution::get_power_level_for_sender(event_id, fetch_event);
|
let pl = StateResolution::get_power_level_for_sender(event_id, &fetch_event);
|
||||||
info!("{} power level {}", event_id, pl);
|
info!("{} power level {}", event_id, pl);
|
||||||
|
|
||||||
event_to_pl.insert(event_id.clone(), pl);
|
event_to_pl.insert(event_id.clone(), pl);
|
||||||
@ -350,7 +350,7 @@ impl StateResolution {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Find the power level for the sender of `event_id` or return a default value of zero.
|
/// Find the power level for the sender of `event_id` or return a default value of zero.
|
||||||
fn get_power_level_for_sender<E, F>(event_id: &EventId, fetch_event: &F) -> i64
|
fn get_power_level_for_sender<E, F>(event_id: &EventId, fetch_event: F) -> i64
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
F: Fn(&EventId) -> Option<Arc<E>>,
|
F: Fn(&EventId) -> Option<Arc<E>>,
|
||||||
@ -404,7 +404,7 @@ impl StateResolution {
|
|||||||
room_version: &RoomVersion,
|
room_version: &RoomVersion,
|
||||||
events_to_check: &[EventId],
|
events_to_check: &[EventId],
|
||||||
unconflicted_state: &StateMap<EventId>,
|
unconflicted_state: &StateMap<EventId>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) -> Result<StateMap<EventId>>
|
) -> Result<StateMap<EventId>>
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
@ -501,7 +501,7 @@ impl StateResolution {
|
|||||||
pub fn mainline_sort<E, F>(
|
pub fn mainline_sort<E, F>(
|
||||||
to_sort: &[EventId],
|
to_sort: &[EventId],
|
||||||
resolved_power_level: Option<&EventId>,
|
resolved_power_level: Option<&EventId>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) -> Vec<EventId>
|
) -> Vec<EventId>
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
@ -545,7 +545,7 @@ impl StateResolution {
|
|||||||
for ev_id in to_sort.iter() {
|
for ev_id in to_sort.iter() {
|
||||||
if let Some(event) = fetch_event(ev_id) {
|
if let Some(event) = fetch_event(ev_id) {
|
||||||
if let Ok(depth) =
|
if let Ok(depth) =
|
||||||
StateResolution::get_mainline_depth(Some(event), &mainline_map, fetch_event)
|
StateResolution::get_mainline_depth(Some(event), &mainline_map, &fetch_event)
|
||||||
{
|
{
|
||||||
order_map.insert(
|
order_map.insert(
|
||||||
ev_id,
|
ev_id,
|
||||||
@ -576,7 +576,7 @@ impl StateResolution {
|
|||||||
fn get_mainline_depth<E, F>(
|
fn get_mainline_depth<E, F>(
|
||||||
mut event: Option<Arc<E>>,
|
mut event: Option<Arc<E>>,
|
||||||
mainline_map: &EventMap<usize>,
|
mainline_map: &EventMap<usize>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) -> Result<usize>
|
) -> Result<usize>
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
@ -608,7 +608,7 @@ impl StateResolution {
|
|||||||
graph: &mut BTreeMap<EventId, BTreeSet<EventId>>,
|
graph: &mut BTreeMap<EventId, BTreeSet<EventId>>,
|
||||||
event_id: &EventId,
|
event_id: &EventId,
|
||||||
auth_diff: &BTreeSet<EventId>,
|
auth_diff: &BTreeSet<EventId>,
|
||||||
fetch_event: &F,
|
fetch_event: F,
|
||||||
) where
|
) where
|
||||||
E: Event,
|
E: Event,
|
||||||
F: Fn(&EventId) -> Option<Arc<E>>,
|
F: Fn(&EventId) -> Option<Arc<E>>,
|
||||||
@ -633,7 +633,7 @@ impl StateResolution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_power_event_id<E, F>(event_id: &EventId, fetch: &F) -> bool
|
pub fn is_power_event_id<E, F>(event_id: &EventId, fetch: F) -> bool
|
||||||
where
|
where
|
||||||
E: Event,
|
E: Event,
|
||||||
F: Fn(&EventId) -> Option<Arc<E>>,
|
F: Fn(&EventId) -> Option<Arc<E>>,
|
||||||
|
@ -30,7 +30,7 @@ fn test_event_sort() {
|
|||||||
// TODO these events are not guaranteed to be sorted but they are resolved, do
|
// TODO these events are not guaranteed to be sorted but they are resolved, do
|
||||||
// we need the auth_chain
|
// we need the auth_chain
|
||||||
let sorted_power_events =
|
let sorted_power_events =
|
||||||
StateResolution::reverse_topological_power_sort(&power_events, &auth_chain, &|id| {
|
StateResolution::reverse_topological_power_sort(&power_events, &auth_chain, |id| {
|
||||||
events.get(id).map(Arc::clone)
|
events.get(id).map(Arc::clone)
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ fn test_event_sort() {
|
|||||||
&RoomVersion::version_6(),
|
&RoomVersion::version_6(),
|
||||||
&sorted_power_events,
|
&sorted_power_events,
|
||||||
&BTreeMap::new(), // unconflicted events
|
&BTreeMap::new(), // unconflicted events
|
||||||
&|id| events.get(id).map(Arc::clone),
|
|id| events.get(id).map(Arc::clone),
|
||||||
)
|
)
|
||||||
.expect("iterative auth check failed on resolved events");
|
.expect("iterative auth check failed on resolved events");
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ fn test_event_sort() {
|
|||||||
|
|
||||||
let power_level = resolved_power.get(&(EventType::RoomPowerLevels, "".to_owned()));
|
let power_level = resolved_power.get(&(EventType::RoomPowerLevels, "".to_owned()));
|
||||||
|
|
||||||
let sorted_event_ids = StateResolution::mainline_sort(&events_to_sort, power_level, &|id| {
|
let sorted_event_ids = StateResolution::mainline_sort(&events_to_sort, power_level, |id| {
|
||||||
events.get(id).map(Arc::clone)
|
events.get(id).map(Arc::clone)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ fn ban_with_auth_chains2() {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
&|id| ev_map.get(id).map(Arc::clone),
|
|id| ev_map.get(id).map(Arc::clone),
|
||||||
) {
|
) {
|
||||||
Ok(state) => state,
|
Ok(state) => state,
|
||||||
Err(e) => panic!("{}", e),
|
Err(e) => panic!("{}", e),
|
||||||
|
@ -266,7 +266,7 @@ fn test_event_map_none() {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
&|id| ev_map.get(id).map(Arc::clone),
|
|id| ev_map.get(id).map(Arc::clone),
|
||||||
) {
|
) {
|
||||||
Ok(state) => state,
|
Ok(state) => state,
|
||||||
Err(e) => panic!("{}", e),
|
Err(e) => panic!("{}", e),
|
||||||
|
@ -121,7 +121,7 @@ pub fn do_check(
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
&|id| event_map.get(id).map(Arc::clone),
|
|id| event_map.get(id).map(Arc::clone),
|
||||||
);
|
);
|
||||||
match resolved {
|
match resolved {
|
||||||
Ok(state) => state,
|
Ok(state) => state,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user