]> Sergey Matveev's repositories - public-inbox.git/commitdiff
searchview: pass named subs to Www*Stream
authorEric Wong <e@80x24.org>
Wed, 25 Dec 2019 07:50:57 +0000 (07:50 +0000)
committerEric Wong <e@80x24.org>
Fri, 27 Dec 2019 20:00:37 +0000 (20:00 +0000)
Both WwwStream and WwwAtomStream ->response pass the WWW $ctx
to the callback nowadays, so we can pass named subs to them.

lib/PublicInbox/SearchView.pm

index 7afb07540f7b8d6cab41769bd2becc2835b35cef..6aa815ca26e487271d48effa9e4f7806ba6d8f76 100644 (file)
@@ -275,8 +275,7 @@ sub get_pct ($) {
 sub mset_thread {
        my ($ctx, $mset, $q) = @_;
        my %pct;
-       my $ibx = $ctx->{-inbox};
-       my $msgs = $ibx->search->retry_reopen(sub { [ map {
+       my $msgs = $ctx->{-inbox}->search->retry_reopen(sub { [ map {
                my $i = $_;
                my $smsg = PublicInbox::SearchMsg->load_doc($i->get_document);
                $pct{$smsg->mid} = get_pct($i);
@@ -303,19 +302,21 @@ sub mset_thread {
                *PublicInbox::View::pre_thread);
 
        @$msgs = reverse @$msgs if $r;
-       sub {
-               return unless $msgs;
-               my $smsg;
-               while (my $m = pop @$msgs) {
-                       $smsg = $ibx->smsg_mime($m) and last;
-               }
-               if ($smsg) {
-                       return PublicInbox::View::index_entry($smsg, $ctx,
-                               scalar @$msgs);
-               }
-               $msgs = undef;
-               $skel .= "\n</pre>";
-       };
+       $ctx->{msgs} = $msgs;
+       \&mset_thread_i;
+}
+
+# callback for PublicInbox::WwwStream::getline
+sub mset_thread_i {
+       my ($nr, $ctx) = @_;
+       my $msgs = $ctx->{msgs} or return;
+       while (my $smsg = pop @$msgs) {
+               $ctx->{-inbox}->smsg_mime($smsg) or next;
+               return PublicInbox::View::index_entry($smsg, $ctx,
+                                                       scalar @$msgs);
+       }
+       my ($skel) = delete @$ctx{qw(dst msgs)};
+       $$skel .= "\n</pre>";
 }
 
 sub ctx_prepare {
@@ -337,17 +338,19 @@ sub ctx_prepare {
 
 sub adump {
        my ($cb, $mset, $q, $ctx) = @_;
-       my $ibx = $ctx->{-inbox};
-       my @items = $mset->items;
-       $ctx->{search_query} = $q;
-       my $srch = $ibx->search;
-       PublicInbox::WwwAtomStream->response($ctx, 200, sub {
-               while (my $x = shift @items) {
-                       $x = load_doc_retry($srch, $x);
-                       $x = $ibx->smsg_mime($x) and return $x;
-               }
-               return undef;
-       });
+       $ctx->{items} = [ $mset->items ];
+       $ctx->{search_query} = $q; # used by WwwAtomStream::atom_header
+       $ctx->{srch} = $ctx->{-inbox}->search;
+       PublicInbox::WwwAtomStream->response($ctx, 200, \&adump_i);
+}
+
+# callback for PublicInbox::WwwAtomStream::getline
+sub adump_i {
+       my ($ctx) = @_;
+       while (my $mi = shift @{$ctx->{items}}) {
+               my $smsg = load_doc_retry($ctx->{srch}, $mi) or next;
+               $ctx->{-inbox}->smsg_mime($smsg) and return $smsg;
+       }
 }
 
 package PublicInbox::SearchQuery;