use std::{env::args, io::Result, thread::spawn};
use nucleo_picker::{PickerOptions, Render};
use serde::{Deserialize, de::DeserializeSeed};
use serde_json::Deserializer;
#[derive(Deserialize)]
struct Poem {
author: String,
title: String,
lines: Vec<String>,
}
struct PoemRenderer;
impl Render<Poem> for PoemRenderer {
type Str<'a> = String;
fn render<'a>(&self, poem: &'a Poem) -> Self::Str<'a> {
poem.lines.join("\n")
}
}
fn main() -> Result<()> {
let opts = PickerOptions::new();
let picker_opts = match args().nth(1) {
Some(s) if s == "--reversed" => opts.reversed(true),
_ => opts,
};
let mut picker = picker_opts.picker(PoemRenderer);
let injector = picker.injector();
spawn(move || {
let poems_json = include_str!("poems.json");
injector
.deserialize(&mut Deserializer::from_str(poems_json))
.unwrap();
});
match picker.pick()? {
Some(poem) => println!("'{}' by {}", poem.title, poem.author),
None => println!("Nothing selected!"),
}
Ok(())
}