use crate::Codex;
use crate::command::CodexCommand;
use crate::error::Result;
use crate::exec::{self, CommandOutput};
fn push_config(
args: &mut Vec<String>,
config_overrides: &[String],
enabled: &[String],
disabled: &[String],
) {
for value in config_overrides {
args.push("-c".into());
args.push(value.clone());
}
for value in enabled {
args.push("--enable".into());
args.push(value.clone());
}
for value in disabled {
args.push("--disable".into());
args.push(value.clone());
}
}
#[derive(Debug, Clone)]
pub struct ArchiveCommand {
session: String,
config_overrides: Vec<String>,
enabled_features: Vec<String>,
disabled_features: Vec<String>,
retry_policy: Option<crate::retry::RetryPolicy>,
}
impl ArchiveCommand {
#[must_use]
pub fn new(session: impl Into<String>) -> Self {
Self {
session: session.into(),
config_overrides: Vec::new(),
enabled_features: Vec::new(),
disabled_features: Vec::new(),
retry_policy: None,
}
}
#[must_use]
pub fn config(mut self, key_value: impl Into<String>) -> Self {
self.config_overrides.push(key_value.into());
self
}
#[must_use]
pub fn enable(mut self, feature: impl Into<String>) -> Self {
self.enabled_features.push(feature.into());
self
}
#[must_use]
pub fn disable(mut self, feature: impl Into<String>) -> Self {
self.disabled_features.push(feature.into());
self
}
#[must_use]
pub fn retry(mut self, policy: crate::retry::RetryPolicy) -> Self {
self.retry_policy = Some(policy);
self
}
}
impl CodexCommand for ArchiveCommand {
type Output = CommandOutput;
fn args(&self) -> Vec<String> {
let mut args = vec!["archive".to_string()];
push_config(
&mut args,
&self.config_overrides,
&self.enabled_features,
&self.disabled_features,
);
args.push(self.session.clone());
args
}
async fn execute(&self, codex: &Codex) -> Result<CommandOutput> {
exec::run_codex_with_retry(codex, self.args(), self.retry_policy.as_ref()).await
}
}
#[derive(Debug, Clone)]
pub struct DeleteCommand {
session: String,
force: bool,
config_overrides: Vec<String>,
enabled_features: Vec<String>,
disabled_features: Vec<String>,
retry_policy: Option<crate::retry::RetryPolicy>,
}
impl DeleteCommand {
#[must_use]
pub fn new(session: impl Into<String>) -> Self {
Self {
session: session.into(),
force: false,
config_overrides: Vec::new(),
enabled_features: Vec::new(),
disabled_features: Vec::new(),
retry_policy: None,
}
}
#[must_use]
pub fn force(mut self) -> Self {
self.force = true;
self
}
#[must_use]
pub fn config(mut self, key_value: impl Into<String>) -> Self {
self.config_overrides.push(key_value.into());
self
}
#[must_use]
pub fn enable(mut self, feature: impl Into<String>) -> Self {
self.enabled_features.push(feature.into());
self
}
#[must_use]
pub fn disable(mut self, feature: impl Into<String>) -> Self {
self.disabled_features.push(feature.into());
self
}
#[must_use]
pub fn retry(mut self, policy: crate::retry::RetryPolicy) -> Self {
self.retry_policy = Some(policy);
self
}
}
impl CodexCommand for DeleteCommand {
type Output = CommandOutput;
fn args(&self) -> Vec<String> {
let mut args = vec!["delete".to_string()];
push_config(
&mut args,
&self.config_overrides,
&self.enabled_features,
&self.disabled_features,
);
if self.force {
args.push("--force".into());
}
args.push(self.session.clone());
args
}
async fn execute(&self, codex: &Codex) -> Result<CommandOutput> {
exec::run_codex_with_retry(codex, self.args(), self.retry_policy.as_ref()).await
}
}
#[derive(Debug, Clone)]
pub struct UnarchiveCommand {
session: String,
config_overrides: Vec<String>,
enabled_features: Vec<String>,
disabled_features: Vec<String>,
retry_policy: Option<crate::retry::RetryPolicy>,
}
impl UnarchiveCommand {
#[must_use]
pub fn new(session: impl Into<String>) -> Self {
Self {
session: session.into(),
config_overrides: Vec::new(),
enabled_features: Vec::new(),
disabled_features: Vec::new(),
retry_policy: None,
}
}
#[must_use]
pub fn config(mut self, key_value: impl Into<String>) -> Self {
self.config_overrides.push(key_value.into());
self
}
#[must_use]
pub fn enable(mut self, feature: impl Into<String>) -> Self {
self.enabled_features.push(feature.into());
self
}
#[must_use]
pub fn disable(mut self, feature: impl Into<String>) -> Self {
self.disabled_features.push(feature.into());
self
}
#[must_use]
pub fn retry(mut self, policy: crate::retry::RetryPolicy) -> Self {
self.retry_policy = Some(policy);
self
}
}
impl CodexCommand for UnarchiveCommand {
type Output = CommandOutput;
fn args(&self) -> Vec<String> {
let mut args = vec!["unarchive".to_string()];
push_config(
&mut args,
&self.config_overrides,
&self.enabled_features,
&self.disabled_features,
);
args.push(self.session.clone());
args
}
async fn execute(&self, codex: &Codex) -> Result<CommandOutput> {
exec::run_codex_with_retry(codex, self.args(), self.retry_policy.as_ref()).await
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn archive_args() {
let args = ArchiveCommand::new("sess-1").args();
assert_eq!(args, vec!["archive", "sess-1"]);
}
#[test]
fn archive_args_with_config() {
let args = ArchiveCommand::new("sess-1")
.config("foo=bar")
.enable("beta")
.args();
assert_eq!(
args,
vec!["archive", "-c", "foo=bar", "--enable", "beta", "sess-1"]
);
}
#[test]
fn delete_args() {
let args = DeleteCommand::new("sess-2").args();
assert_eq!(args, vec!["delete", "sess-2"]);
}
#[test]
fn delete_args_force() {
let args = DeleteCommand::new("sess-2").force().args();
assert_eq!(args, vec!["delete", "--force", "sess-2"]);
}
#[test]
fn unarchive_args() {
let args = UnarchiveCommand::new("sess-3").args();
assert_eq!(args, vec!["unarchive", "sess-3"]);
}
}