11use crate :: cli:: Cli ;
2- use crate :: filter:: { ArcFilter , BufferFilter , LevelFilter , PidFilter , RevertFilter , TagFilter } ;
2+ use crate :: filter:: { BufferFilter , Filter , LevelFilter , PidFilter , RevertFilter , TagFilter } ;
33use crate :: sink:: { FileSink , Sink , TerminalSink } ;
44use crate :: source:: { ADBSource , Source } ;
55use anyhow:: Result ;
66use futures:: StreamExt ;
7- use std:: sync:: Arc ;
87use tokio:: process:: { Child , Command } ;
98
109mod cli;
@@ -38,23 +37,26 @@ async fn main() {
3837}
3938
4039async fn fetch ( cli : Cli ) {
41- let source = Arc :: new ( ADBSource :: new ( if cli. device . is_empty ( ) {
40+ let source = ADBSource :: new ( if cli. device . is_empty ( ) {
4241 None
4342 } else {
4443 Some ( cli. device )
45- } ) ) ;
44+ } ) ;
4645
47- let filter: ArcFilter = Arc :: new ( PidFilter :: new ( cli. process , None ) ) ;
48- let filter: ArcFilter = Arc :: new ( BufferFilter :: new ( cli. buffers , Some ( filter) ) ) ;
49- let filter: ArcFilter = Arc :: new ( LevelFilter :: new ( cli. level , Some ( filter) ) ) ;
50- let filter: ArcFilter = Arc :: new ( TagFilter :: new ( cli. tag , cli. ignore , Some ( filter) ) ) ;
51- let filter: ArcFilter = Arc :: new ( RevertFilter :: new ( cli. revert , cli. ignore , Some ( filter) ) ) ;
46+ let filters: Vec < Box < dyn Filter > > = vec ! [
47+ Box :: new( PidFilter :: new( cli. process) ) ,
48+ Box :: new( BufferFilter :: new( cli. buffers) ) ,
49+ Box :: new( LevelFilter :: new( cli. level) ) ,
50+ Box :: new( TagFilter :: new( cli. tag, cli. ignore) ) ,
51+ Box :: new( RevertFilter :: new( cli. revert, cli. ignore) ) ,
52+ ] ;
5253
53- let mut sinks: Vec < Arc < dyn Sink > > = Vec :: new ( ) ;
54- sinks. push ( Arc :: new ( TerminalSink :: new ( cli. color , cli. tag_width ) ) ) ;
54+ let mut sinks: Vec < Box < dyn Sink > > = Vec :: new ( ) ;
55+
56+ sinks. push ( Box :: new ( TerminalSink :: new ( cli. color , cli. tag_width ) ) ) ;
5557 if let Some ( file) = cli. output {
5658 if let Ok ( file) = FileSink :: new ( file) . await {
57- sinks. push ( Arc :: new ( file) ) ;
59+ sinks. push ( Box :: new ( file) ) ;
5860 }
5961 }
6062
@@ -63,9 +65,15 @@ async fn fetch(cli: Cli) {
6365 while let Some ( r) = logs. next ( ) . await {
6466 match r {
6567 Ok ( log) => {
66- let l = { filter. filter ( log) . await } ;
68+ let mut is_filter = false ;
69+ for filter in & filters {
70+ if filter. filter ( & log) . await {
71+ is_filter = true ;
72+ break ;
73+ }
74+ }
6775
68- if let Some ( log ) = l {
76+ if !is_filter {
6977 for sink in & sinks {
7078 sink. write ( log. clone ( ) ) . await ;
7179 }
0 commit comments