buntrail_engine/remote/
search.rs1use super::*;
2impl SearchService for RemoteServices {
3 fn search(
4 &self,
5 r: SearchRequest,
6 ) -> ServiceFuture<'_, Result<EventStream<SearchEvent>, CoreError>> {
7 Box::pin(async move {
8 self.check(&r.root.target)?;
9 Ok(Box::pin(Search {
10 source: self.stream(
11 w::Call::Search {
12 request: w::Search::from_core(&r)?,
13 },
14 None,
15 )?,
16 target: self.target.clone(),
17 }) as EventStream<SearchEvent>)
18 })
19 }
20}
21struct Search {
22 source: Replies,
23 target: TargetIdentity,
24}
25impl Stream for Search {
26 type Item = Result<SearchEvent, CoreError>;
27 fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
28 let result = Pin::new(&mut self.source).poll_next(cx);
29 result.map(|v| {
30 v.map(|r| {
31 let r = match r {
32 Ok(r) => r,
33 Err(e) => return Ok(SearchEvent::Failed(e)),
34 };
35 Ok(match r {
36 w::Reply::SearchMatch {
37 file,
38 line,
39 column_utf8,
40 preview,
41 version,
42 digest,
43 } => SearchEvent::Match(Box::new(SearchMatch {
44 file: file.core(&self.target)?,
45 line,
46 preview_column_utf8: column_utf8,
47 preview,
48 searched_version: version.core(&self.target)?,
49 searched_digest: w::digest(&digest)?,
50 })),
51 w::Reply::SearchProgress { files, matches } => {
52 SearchEvent::Progress { files, matches }
53 }
54 w::Reply::SearchComplete => SearchEvent::Complete,
55 w::Reply::SearchCancelled => SearchEvent::Cancelled,
56 w::Reply::SearchLimited { maximum } => SearchEvent::Limited { maximum },
57 _ => return Err(w::invalid()),
58 })
59 })
60 })
61 }
62}