| use std::io; |
| |
| use docopt::Docopt; |
| use fst::raw::Fst; |
| |
| use util; |
| use Error; |
| |
| const USAGE: &'static str = " |
| Issues a range query against the given transducer. |
| |
| A range query returns all search results within a particular. |
| |
| If neither the start or the end of the range is specified, then all entries |
| in the transducer are shown. |
| |
| Usage: |
| fst range [options] <fst> |
| fst range --help |
| |
| Options: |
| -h, --help Display this message. |
| -o, --outputs When set, output values are shown as CSV data. |
| -s, --start ARG Only show results greater than or equal to this. |
| -e, --end ARG Only show results less than or equal to this. |
| "; |
| |
| #[derive(Debug, Deserialize)] |
| struct Args { |
| arg_fst: String, |
| flag_outputs: bool, |
| flag_start: Option<String>, |
| flag_end: Option<String>, |
| } |
| |
| pub fn run(argv: Vec<String>) -> Result<(), Error> { |
| let args: Args = Docopt::new(USAGE) |
| .and_then(|d| d.argv(&argv).deserialize()) |
| .unwrap_or_else(|e| e.exit()); |
| let fst = unsafe { Fst::from_path(&args.arg_fst) }?; |
| let mut q = fst.range(); |
| if let Some(ref start) = args.flag_start { |
| q = q.ge(start); |
| } |
| if let Some(ref end) = args.flag_end { |
| q = q.le(end); |
| } |
| util::print_stream(io::BufWriter::new(io::stdout()), args.flag_outputs, q) |
| } |