p: JsV,
}
+pub trait LogIgnoreBefore {
+ fn matches(&mut self, s: &str) -> bool;
+}
+type LogIgnoreBeforeFn<'r> = &'r mut dyn FnMut(&str) -> bool;
+
+impl<'r> LogIgnoreBefore for LogIgnoreBeforeFn<'r> {
+ fn matches<'s>(&mut self, s: &'s str) -> bool { self(s) }
+}
+
impl<'g> WindowGuard<'g> {
#[throws(AE)]
pub fn piece_vpid(&'g self, some_pieceid: &'_ str) -> Vpid {
}
#[throws(AE)]
- pub fn retrieve_log(
- &self,
- ignore_before: &mut dyn FnMut(&str) -> bool)
- -> Vec<String>
+ pub fn retrieve_log<I: LogIgnoreBefore>(&self, mut ignore_before: I)
+ -> Vec<String>
{
- let log = self.find_elements(By::ClassName("logmsg"))?;
- let log = log.iter()
- .rev()
- .map(|e| e.inner_html())
- .take_while(|h| {
- h.as_ref().ok()
- .map(|s: &String| ignore_before(s))
- != Some(true)
- })
- .collect::<Result<Vec<String>,_>>()?;
-
- assert!( ! log.is_empty() );
+ #[throws(AE)]
+ fn inner<'g, 'i>
+ (w: &'g WindowGuard, ignore_before: LogIgnoreBeforeFn<'i>)
+ -> Vec<String>
+ {
+ let log = w.find_elements(By::ClassName("logmsg"))?;
+ let log = log.iter()
+ .rev()
+ .map(|e| e.inner_html())
+ .take_while(|h| {
+ h.as_ref().ok()
+ .map(|s: &String| ignore_before(s))
+ != Some(true)
+ })
+ .collect::<Result<Vec<String>,_>>()?;
+
+ assert!( ! log.is_empty() );
+
+ dbg!(log)
+ }
- dbg!(log)
+ inner(&self, &mut move |s| ignore_before.matches(s))?
}
#[throws(AE)]
for side in &[&self.alice, &self.bob] {
let mut w = su.w(side)?;
w.synch()?;
- let log = w.retrieve_log(&mut |_|false)?;
+ let log = w.retrieve_log((&mut |_: &'_ _| false) as LogIgnoreBeforeFn)?;
assert_eq!(log.find_conflict(), None);
}
let p = w.find_piece(pc)?;
let now = p.posg()?;
- let log = w.retrieve_log(&mut |s| s.contains("black knight"))?;
+ let log = w.retrieve_log((&mut |s: &str| s.contains("black knight"))
+ as LogIgnoreBeforeFn)?;
let held = w.piece_held(&pc)?;
let client = w.client()?;
let yes = held.as_ref() == Some(&client);