use anyhow::{anyhow, bail, Result};
use polars::prelude::*;
use std::path::PathBuf;
use crate::parser::Expr;
use super::*;
pub fn eval(args: &[Expr], ctx: &mut Context) -> Result<()> {
let path = PathBuf::from(args::string(&args[0]));
let overwrite = args::named_bool(args, "overwrite")?;
if let Some(df) = ctx.take_df() {
if !overwrite && path.exists() {
bail!("csv error: file '{}' already exists", path.display());
}
let file = std::fs::File::create(&path)
.map_err(|e| anyhow!("csv error: cannot create file '{}' {e}", path.display()))?;
let mut out_df = df.clone().collect()?;
ctx.set_df(df)?;
CsvWriter::new(file).finish(&mut out_df)?;
} else {
let reader = LazyCsvReader::new(&path).with_infer_schema_length(Some(1000));
let df = reader
.finish()
.map_err(|e| anyhow!("csv error: cannot read file '{}' {e}", path.display()))?;
ctx.set_df(df)?;
}
Ok(())
}