use std::{env, fs};
use anyhow::{Context, Result, bail};
use tracing::info;
use crate::{
output::display_path,
pre::{self, PreJson, PreMode},
workspace::Workspace,
};
pub(crate) fn enter(tag: &str) -> Result<()> {
let workspace = Workspace::discover(&env::current_dir()?)?;
let changeset_dir = workspace.root().join(".changeset");
let pre = PreJson::load(&changeset_dir)?;
if matches!(&pre, Some(pre) if pre.mode() == PreMode::Pre) {
bail!("already in pre mode; run `changesette pre exit` to exit");
}
pre::validate_tag(tag)?;
if let Some(mut pre) = pre {
pre.set_mode(PreMode::Pre);
pre.set_tag(tag);
fs::write(pre.path(), pre.text()).with_context(|| display_path(pre.path()))?;
} else {
fs::create_dir_all(&changeset_dir).with_context(|| display_path(&changeset_dir))?;
pre::write_new(&changeset_dir, tag)?;
}
info!(
"Entered pre mode with tag `{tag}`\nRun `changesette version` to bump to prerelease versions"
);
Ok(())
}
pub(crate) fn exit() -> Result<()> {
let workspace = Workspace::discover(&env::current_dir()?)?;
let changeset_dir = workspace.root().join(".changeset");
let Some(mut pre) = PreJson::load(&changeset_dir)? else {
bail!("not in pre mode; run `changesette pre enter <tag>` to enter");
};
pre.set_mode(PreMode::Exit);
fs::write(pre.path(), pre.text()).with_context(|| display_path(pre.path()))?;
info!("Exited pre mode\nRun `changesette version` to bump to final versions");
Ok(())
}