use std::{
env::{self, temp_dir},
fs,
process::{Command, Stdio},
};
use anyhow::{bail, Context, Result};
use clap::Parser;
use io_calendar::item::CalendarItem;
use pimalaya_toolbox::terminal::printer::Printer;
use crate::{account::Account, client::Client};
#[derive(Debug, Parser)]
pub struct CreateItemCommand {
#[arg(name = "CALENDAR-ID")]
pub calendar_id: String,
}
impl CreateItemCommand {
pub fn execute(self, printer: &mut impl Printer, account: Account) -> Result<()> {
let mut client = Client::new(&account)?;
let uid = CalendarItem::new_uuid();
let path = temp_dir().join(format!("{uid}.ics"));
let tpl = include_str!("./create.ics");
fs::write(&path, tpl)?;
let args = env::var("EDITOR")?;
let mut args = args.split_whitespace();
let editor = args.next().unwrap();
let edition = Command::new(editor)
.args(args)
.arg(&path)
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.status()?;
if !edition.success() {
let code = edition.code();
bail!("error while editing iCalendar: error code {code:?}");
}
let content = fs::read_to_string(&path)?
.replace('\r', "")
.replace('\n', "\r\n");
let item = CalendarItem {
id: CalendarItem::new_uuid().to_string(),
calendar_id: self.calendar_id,
ical: CalendarItem::parse(content).context("cannot parse iCal")?,
};
client.create_item(item)?;
printer.out("Item successfully created")
}
}