yofi 0.2.1

minimalistic menu for wayland
Documentation
use anyhow::{Context, Result};

use super::{Entry, EvalInfo};

pub struct DialogMode {
    lines: Vec<String>,
}

impl DialogMode {
    pub fn new() -> Result<Self> {
        std::io::stdin()
            .lines()
            .collect::<Result<_, _>>()
            .context("failed to read stdin")
            .map(|lines| Self { lines })
    }

    pub fn eval(&mut self, info: EvalInfo<'_>) -> Result<std::convert::Infallible> {
        let value = info
            .index
            .and_then(|idx| Some(self.lines.get(idx)?.as_str()))
            .unwrap_or(info.input_value.source);
        println!("{value}");
        std::process::exit(0);
    }

    pub fn entries_len(&self) -> usize {
        self.lines.len()
    }

    pub fn subentries_len(&self, _: usize) -> usize {
        0
    }

    pub fn entry(&self, idx: usize, _: usize) -> Entry<'_> {
        Entry {
            name: self.lines[idx].as_ref(),
            subname: None,
            icon: None,
        }
    }

    pub fn text_entries(&self) -> impl super::ExactSizeIterator<Item = &str> {
        self.lines.iter().map(|e| e.as_str())
    }
}