From: Ian Jackson Date: Sun, 24 Apr 2022 18:34:14 +0000 (+0100) Subject: apitest: Break out filter_by_desc_glob etc. X-Git-Tag: otter-1.1.0~459 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=738d1fcbeeced610eb8c3013a36bb0f666cdf37c;p=otter.git apitest: Break out filter_by_desc_glob etc. Signed-off-by: Ian Jackson --- diff --git a/apitest/at-bundles.rs b/apitest/at-bundles.rs index 9e2e86c9..ede198d5 100644 --- a/apitest/at-bundles.rs +++ b/apitest/at-bundles.rs @@ -26,9 +26,7 @@ impl Ctx { let pieces = alice.pieces::()?; dbgc!(&pieces); for expect in &["a purple knight", "a yellow bishop"] { - pieces.iter().find( - |p| p.info["desc"].as_str() == Some(expect) - ).expect(expect); + let _: PIA = pieces.find_by_desc_glob(expect); } Ok(()) diff --git a/apitest/at-otter.rs b/apitest/at-otter.rs index 808da01f..4214301b 100644 --- a/apitest/at-otter.rs +++ b/apitest/at-otter.rs @@ -37,14 +37,7 @@ impl Ctx { // ----- alice: claim alices' hand ----- - let [hand] = a_pieces.iter_enumerated() - .filter(|(_i,p)| { - p.info["desc"] == otter::hand::UNCLAIMED_HAND_DESC - }) - .map(|(i,_)| i) - .collect::>() - .into_inner().unwrap(); - dbgc!(&hand); + let hand = a_pieces.find_by_desc_glob(otter::hand::UNCLAIMED_HAND_DESC); alice.api_piece(GH::With, PuSynch((&mut a_pieces, hand)), ("k", json!({ "opname": "claim", @@ -54,11 +47,9 @@ impl Ctx { // ----- find the pawns ----- fn find_pawns(pieces: &PiecesSlice) -> [PI; 2] { - let mut pawns = pieces.iter_enumerated() - .filter(|(_i,p)| p.info["desc"].as_str().unwrap().ends_with(" pawn")) - .map(|(i,_)| i) - .take(2) - .collect::>() + let mut pawns = pieces + .ids_by_desc_glob("* pawn") + .take(2).collect::>() .into_inner().unwrap(); pawns.sort_by_key(|&p| -pieces[p].pos.x()); diff --git a/apitest/atmain.rs b/apitest/atmain.rs index 085547f5..6deb69b2 100644 --- a/apitest/atmain.rs +++ b/apitest/atmain.rs @@ -380,6 +380,31 @@ impl Session { } } +#[ext(pub)] +impl IndexSlice]> where PI: index_vec::Idx { + fn filter_by_desc_glob(&self, desc_glob: &str) + -> Box)> + '_> { + let glob = glob::Pattern::new(desc_glob).unwrap(); + let iter = self.iter_enumerated() + .filter(move |(_i,p)| glob.matches(p.info["desc"].as_str().unwrap())); + Box::new(iter) as _ + } + fn ids_by_desc_glob(&self, desc_glob: &str) + -> Box + '_> { + let iter = self.filter_by_desc_glob(desc_glob) + .map(|(id,_p)| id); + Box::new(iter) as _ + } + fn find_by_desc_glob(&self, desc_glob: &str) -> PI { + let [pc] = self.filter_by_desc_glob(desc_glob) + .map(|(i,_p)| i) + .collect::>() + .into_inner().expect("multiple pieces matched, unexpectedly"); + dbgc!(desc_glob, pc); + pc + } +} + pub fn update_update_pieces( nick: &str, pieces: &mut Pieces, @@ -521,10 +546,11 @@ impl UsualCtx { let mut session = self.connect_player(&self.alice)?; let pieces = session.pieces::()?; - let llm = pieces.into_iter() - .filter(|pi| pi.info["desc"] == "a library load area marker") - .collect::>(); - let llm: [_;2] = llm.into_inner().unwrap(); + let llm: [_;2] = pieces + .filter_by_desc_glob("a library load area marker") + .map(|(_id,p)| p) + .collect::>() + .into_inner().unwrap(); dbgc!(&llm); for (llm, &pos) in izip!(&llm, [PosC::new(5,5), PosC::new(50,25)].iter())