diff --git a/src/api/client.rs b/src/api/client.rs index b5b0300..c7a2c7d 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -163,14 +163,14 @@ impl ApiClient { pub async fn update_bug_review( &self, bug_id: &BugId, - state: &str, - dismissal_reason: Option<&str>, + state: BugReviewState, + dismissal_reason: Option, notes: Option<&str>, ) -> Result { let path = format!("/public/v1/bugs/{}/review", bug_id); let request = BugReviewRequest { - state: state.to_string(), - dismissal_reason: dismissal_reason.map(String::from), + state, + dismissal_reason, notes: notes.map(String::from), }; let body = serde_json::to_value(request)?; diff --git a/src/api/types.rs b/src/api/types.rs index 2666875..80de7e6 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -154,9 +154,9 @@ impl std::fmt::Display for BugDismissalReason { #[derive(Debug, Serialize)] pub struct BugReviewRequest { - pub state: String, + pub state: BugReviewState, #[serde(skip_serializing_if = "Option::is_none")] - pub dismissal_reason: Option, + pub dismissal_reason: Option, #[serde(skip_serializing_if = "Option::is_none")] pub notes: Option, } diff --git a/src/commands/bugs.rs b/src/commands/bugs.rs index 05564c2..002d82b 100644 --- a/src/commands/bugs.rs +++ b/src/commands/bugs.rs @@ -35,6 +35,7 @@ pub enum DismissalReason { } impl DismissalReason { + #[allow(dead_code)] fn as_str(&self) -> &str { match self { DismissalReason::NotABug => "not_a_bug", @@ -276,7 +277,7 @@ pub async fn handle(command: &BugCommands, cli: &crate::Cli) -> Result<()> { dismissal_reason, notes, } => { - use crate::api::types::BugId; + use crate::api::types::{BugDismissalReason, BugId, BugReviewState}; // Validate that dismissal_reason is provided when state is dismissed if matches!(state, ReviewState::Dismissed) && dismissal_reason.is_none() { @@ -285,15 +286,20 @@ pub async fn handle(command: &BugCommands, cli: &crate::Cli) -> Result<()> { let bug_id = BugId::new(bug_id).map_err(|e| anyhow::anyhow!(e))?; - let dismissal_reason_str = dismissal_reason.as_ref().map(|r| r.as_str()); + let api_state = match state { + ReviewState::Pending => BugReviewState::Pending, + ReviewState::Resolved => BugReviewState::Resolved, + ReviewState::Dismissed => BugReviewState::Dismissed, + }; + let api_reason = dismissal_reason.as_ref().map(|r| match r { + DismissalReason::NotABug => BugDismissalReason::NotABug, + DismissalReason::WontFix => BugDismissalReason::WontFix, + DismissalReason::Duplicate => BugDismissalReason::Duplicate, + DismissalReason::Other => BugDismissalReason::Other, + }); client - .update_bug_review( - &bug_id, - state.as_str(), - dismissal_reason_str, - notes.as_deref(), - ) + .update_bug_review(&bug_id, api_state, api_reason, notes.as_deref()) .await .context("Failed to update bug review")?;