use std::{io, process::Command};
use clap::ValueEnum;
use tempdir::TempDir;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("could not execute `lei`: {0}")]
Start(#[from] io::Error),
#[error("`lei` failed execution with error code {0}")]
Code(i32),
#[error("`lei` execution unexpectedly terminated by signal.")]
Signal,
}
type Result<T = ()> = core::result::Result<T, Error>;
#[derive(ValueEnum, Clone, Copy, Debug)]
pub enum Interval {
Day,
Week,
Month,
Year,
}
pub fn query(interval: Interval, query: &str) -> Result<TempDir> {
let interval = match interval {
Interval::Day => "2.day.ago",
Interval::Week => "2.week.ago",
Interval::Month => "3.month.ago",
Interval::Year => "1.year.ago",
};
let tmpdir = TempDir::new("lkml-lei")?;
let res = Command::new("lei")
.arg("q")
.args([
"--no-save",
"--threads",
"--include=https://lore.kernel.org/all",
])
.arg(format!("--output={}", tmpdir.path().display()))
.arg(format!("({query}) AND rt:{interval}.."))
.status()?;
if !res.success() {
Err(res.code().map(Error::Code).unwrap_or(Error::Signal))
} else {
Ok(tmpdir)
}
}