ocs 0.1.0

A session picker for OpenCode
use super::*;

#[derive(Parser)]
#[command(about = "A fuzzy OpenCode session picker")]
pub(crate) struct Arguments {
  #[arg(long, value_name = "PATH", help = "OpenCode data directory")]
  pub(crate) data_dir: Option<PathBuf>,
  #[arg(long, help = "Print the selected session ID instead of opening it")]
  pub(crate) print: bool,
  #[arg(long, help = "Initial fuzzy-search query")]
  pub(crate) query: Option<String>,
}

impl Arguments {
  pub(crate) fn run(self) -> Result {
    let storage = match self.data_dir {
      Some(data_dir) => Storage::new(data_dir),
      None => Storage::default()?,
    };

    let sessions = storage.sessions()?;

    let selected =
      SessionPicker::new(&storage, &sessions, self.query).pick()?;

    let Some(id) = selected else {
      return Ok(());
    };

    if self.print {
      println!("{id}");
      return Ok(());
    }

    let session = sessions
      .iter()
      .find(|session| session.id == id)
      .context("selected session was not indexed")?;

    session.open()
  }
}