use async_std::io::prelude::*;
use async_std::task::spawn;
use futures_lite::future;
use std::env::args;
async fn read_file(name: String, pager: minus::Pager) -> Result<(), Box<dyn std::error::Error>> {
let file = async_std::fs::File::open(name).await?;
let changes = async {
let mut buff = String::new();
let mut buf_reader = async_std::io::BufReader::new(file);
buf_reader.read_to_string(&mut buff).await?;
pager.push_str(&buff)?;
Result::<(), Box<dyn std::error::Error>>::Ok(())
};
let pager = pager.clone();
let (res1, res2) =
future::zip(spawn(async move { minus::dynamic_paging(pager) }), changes).await;
res1?;
res2?;
Ok(())
}
#[async_std::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let arguments: Vec<String> = args().collect();
if arguments.len() < 2 {
panic!("Not enough arguments");
}
let filename = arguments[1].clone();
let output = minus::Pager::new();
output.set_prompt(&filename)?;
read_file(filename, output).await
}