use std::path::PathBuf;
use anyhow::Result;
use clap::Args;
use libsail::collection::{Indexable, Iterable};
use crate::cli::FormatArg;
use crate::commands::draw_size;
use crate::input::{Inputs, dispatch};
use crate::output::{emit, writer};
#[derive(Args)]
pub struct SampleArgs {
#[arg(default_value = "-")]
pub input: PathBuf,
#[arg(short = 'n', long, conflicts_with = "fraction")]
pub count: Option<usize>,
#[arg(short = 'p', long)]
pub fraction: Option<f64>,
#[arg(long)]
pub seed: Option<u64>,
#[arg(long, value_enum)]
pub format: Option<FormatArg>,
#[arg(short, long)]
pub output: Option<PathBuf>,
}
impl SampleArgs {
pub fn run(self) -> Result<()> {
let inputs = Inputs::read(std::slice::from_ref(&self.input), self.format)?;
let entry = &inputs.entries()[0];
let out = writer(self.output.as_deref())?;
let (count, fraction) = (self.count, self.fraction);
let seed = self.seed.unwrap_or_else(rand::random);
dispatch!(inputs.format(), entry, |collection, _size, _name, write| {
let n = draw_size(count, fraction, collection.len())?;
emit(collection.sample(n, seed).iter(), write, out)
})
}
}