rustdoc-index 0.7.1

A fast listing tool for rustdoc
Documentation
use rayon::prelude::*;
use rustdoc_index::*;
use std::io::{stdout, BufWriter, Write};
use structopt::StructOpt;

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(name = "listdoc")]
    _void: String,
    #[structopt(subcommand)]
    pub sub: Option<SubCommand>
}

#[derive(Debug, StructOpt)]
enum SubCommand {
    Show,
    Location(Location)
}

#[derive(Debug, StructOpt)]
struct Location {
    #[structopt(name = "line")]
    #[structopt(help = "A line of list")]
    line: String
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    let opt: Opt = Opt::from_args();
    run(opt).await
}

async fn run(opt: Opt) -> Result<(), Error> {
    match opt.sub.unwrap_or(SubCommand::Show) {
        SubCommand::Show => list().await,
        SubCommand::Location(args) => location(args).await
    }
}

async fn list() -> Result<(), Error> {
    for search_index in search_index::search_indexes(None).await?.into_iter() {
        let doc = read_search_index(search_index)?;
        doc.try_for_each(|r: Result<(String, doc::Crate), Error>| -> Result<(), _> {
            let out = stdout();
            let mut out = BufWriter::new(out.lock());
            r.and_then(|(_name, krate)| -> Result<_, _> {
                for path in krate.items() {
                    writeln!(out, "{}", path)?;
                }
                Ok(())
            })
        })
        .unwrap();
    }
    Ok(())
}

async fn location(args: Location) -> Result<(), Error> {
    let url = location::location_from_line(&args.line, None).await?;
    println!("{}", url);
    Ok(())
}