use std::path::Path;
use serde::Serialize;
use crate::context::{open_repo, void_err_to_cli};
use crate::output::{run_command, CliError, CliOptions};
#[derive(Debug, Clone, Serialize)]
pub struct MvOutput {
pub from: String,
pub to: String,
}
pub fn run(cwd: &Path, source: String, dest: String, opts: &CliOptions) -> Result<(), CliError> {
run_command("mv", opts, |ctx| {
if source.trim().is_empty() {
return Err(CliError::invalid_args("No source path specified."));
}
if dest.trim().is_empty() {
return Err(CliError::invalid_args("No destination path specified."));
}
let repo = open_repo(cwd)?;
ctx.progress("Moving file...");
let result = repo.mv(&source, &dest).map_err(void_err_to_cli)?;
if !ctx.use_json() {
ctx.info(format!("Renamed {} -> {}", result.from, result.to));
}
Ok(MvOutput {
from: result.from,
to: result.to,
})
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_mv_output_serialization() {
let output = MvOutput {
from: "old/path.rs".to_string(),
to: "new/path.rs".to_string(),
};
let json = serde_json::to_string(&output).unwrap();
assert!(json.contains("\"from\""));
assert!(json.contains("\"to\""));
assert!(json.contains("old/path.rs"));
assert!(json.contains("new/path.rs"));
}
}