feat: delete local review comments from CLI
This commit is contained in:
+33
-7
@@ -12,6 +12,7 @@ use vamp::{
|
||||
|
||||
pub struct Request {
|
||||
id: Option<i64>,
|
||||
delete_comment: Option<u64>,
|
||||
repo: Option<PathBuf>,
|
||||
json: bool,
|
||||
all: bool,
|
||||
@@ -19,22 +20,37 @@ pub struct Request {
|
||||
|
||||
impl Request {
|
||||
pub fn parse(args: &mut impl Iterator<Item = OsString>) -> Result<Self, String> {
|
||||
let command = args.next().ok_or("--review requires list or show ID")?;
|
||||
let usage = "--review requires list, show ID, or delete REVIEW_ID COMMENT_ID";
|
||||
let command = args.next().ok_or(usage)?;
|
||||
let id = if command == "list" {
|
||||
None
|
||||
} else if command == "show" {
|
||||
let id = args.next().ok_or("show requires a positive review ID")?;
|
||||
} else if command == "show" || command == "delete" {
|
||||
let error = "show/delete requires a positive review ID";
|
||||
let id = args.next().ok_or(error)?;
|
||||
Some(
|
||||
id.to_str()
|
||||
.and_then(|id| id.parse::<i64>().ok())
|
||||
.filter(|id| *id > 0)
|
||||
.ok_or("show requires a positive review ID")?,
|
||||
.ok_or(error)?,
|
||||
)
|
||||
} else {
|
||||
return Err("--review requires list or show ID".into());
|
||||
return Err(usage.into());
|
||||
};
|
||||
let delete_comment = if command == "delete" {
|
||||
let error = "delete requires a positive comment ID";
|
||||
let id = args.next().ok_or(error)?;
|
||||
Some(
|
||||
id.to_str()
|
||||
.and_then(|id| id.parse::<u64>().ok())
|
||||
.filter(|id| *id > 0)
|
||||
.ok_or(error)?,
|
||||
)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
Ok(Self {
|
||||
id,
|
||||
delete_comment,
|
||||
repo: None,
|
||||
json: false,
|
||||
all: false,
|
||||
@@ -50,7 +66,8 @@ impl Request {
|
||||
self.repo = Some(PathBuf::from(args.next().ok_or("--repo requires a path")?));
|
||||
} else if arg == "--json" && !self.json {
|
||||
self.json = true;
|
||||
} else if arg == "--all" && self.id.is_some() && !self.all {
|
||||
} else if arg == "--all" && self.id.is_some() && self.delete_comment.is_none() && !self.all
|
||||
{
|
||||
self.all = true;
|
||||
} else {
|
||||
return Err(format!(
|
||||
@@ -115,10 +132,19 @@ pub fn run(request: &Request, config: Option<&Path>) -> Result<(), String> {
|
||||
let root = repository::discover_root(request.repo.as_deref().unwrap_or(&cwd))?;
|
||||
let store = Store::open_read_only(&directory)?;
|
||||
let output = if let Some(id) = request.id {
|
||||
let review = store
|
||||
let mut review = store
|
||||
.as_ref()
|
||||
.ok_or("Review does not exist in this repository")?
|
||||
.load(&root, id)?;
|
||||
if let Some(comment_id) = request.delete_comment {
|
||||
let index = review
|
||||
.comments
|
||||
.iter()
|
||||
.position(|comment| comment.id == comment_id)
|
||||
.ok_or_else(|| format!("Comment {comment_id} does not exist in review {id}"))?;
|
||||
review.comments.remove(index);
|
||||
Store::open(&directory)?.save(&mut review)?;
|
||||
}
|
||||
envelope(&review, request.all, true)
|
||||
} else {
|
||||
let reviews = match store {
|
||||
|
||||
Reference in New Issue
Block a user