diff --git a/src/cmd/target_cmd.rs b/src/cmd/target_cmd.rs index 62f138c1..607c10f6 100644 --- a/src/cmd/target_cmd.rs +++ b/src/cmd/target_cmd.rs @@ -4,6 +4,7 @@ use db; use shell::Readline; use sn0int_common::metadata::Source; use structopt::StructOpt; +use term; use models::*; @@ -22,24 +23,41 @@ pub fn run(rl: &mut Readline, args: &[String]) -> Result<()> { .ok_or_else(|| format_err!("No module selected")) .map(|x| x.source().clone())?; + let source = source + .ok_or_else(|| format_err!("Module doesn't have sources"))?; + if args.filter.is_empty() { match source { - Some(Source::Domains) => select::(rl)?, - Some(Source::Subdomains) => select::(rl)?, - Some(Source::IpAddrs) => select::(rl)?, - Some(Source::Urls) => select::(rl)?, - Some(Source::Emails) => select::(rl)?, - None => bail!("Module doesn't have sources"), + Source::Domains => select::(rl)?, + Source::Subdomains => select::(rl)?, + Source::IpAddrs => select::(rl)?, + Source::Urls => select::(rl)?, + Source::Emails => select::(rl)?, } } else { debug!("Setting filter to {:?}", args.filter); let filter = db::Filter::parse_optional(&args.filter)?; rl.set_target(Some(filter)); + term::info(&format!("{} entities selected", count_selected(rl, &source)?)); } Ok(()) } +fn count_selected(rl: &mut Readline, source: &Source) -> Result { + let db = rl.db(); + let filter = rl.scoped_targets(); + + let num = match source { + Source::Domains => db.filter::(&filter)?.len(), + Source::Subdomains => db.filter::(&filter)?.len(), + Source::IpAddrs => db.filter::(&filter)?.len(), + Source::Urls => db.filter::(&filter)?.len(), + Source::Emails => db.filter::(&filter)?.len(), + }; + Ok(num) +} + fn select(rl: &mut Readline) -> Result<()> { let filter = rl.scoped_targets();