pointbreak 0.5.0

Durable terminal code review for changes humans and coding agents collaborate on together
Documentation
use serde::{Deserialize, Serialize};

use super::RevisionId;

#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ValidationStatus {
    Passed,
    Failed,
    Errored,
    Skipped,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ValidationTrigger {
    Manual,
    Push,
    PullRequest,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(
    tag = "kind",
    rename_all = "snake_case",
    rename_all_fields = "camelCase"
)]
pub enum ValidationTarget {
    Revision { revision_id: RevisionId },
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn validation_status_serializes_four_variants_in_snake_case() {
        for (variant, wire) in [
            (ValidationStatus::Passed, "\"passed\""),
            (ValidationStatus::Failed, "\"failed\""),
            (ValidationStatus::Errored, "\"errored\""),
            (ValidationStatus::Skipped, "\"skipped\""),
        ] {
            assert_eq!(serde_json::to_string(&variant).unwrap(), wire);
            let back: ValidationStatus = serde_json::from_str(wire).unwrap();
            assert_eq!(back, variant);
        }
    }

    #[test]
    fn validation_trigger_serializes_snake_case() {
        assert_eq!(
            serde_json::to_string(&ValidationTrigger::Manual).unwrap(),
            "\"manual\""
        );
        assert_eq!(
            serde_json::to_string(&ValidationTrigger::Push).unwrap(),
            "\"push\""
        );
        assert_eq!(
            serde_json::to_string(&ValidationTrigger::PullRequest).unwrap(),
            "\"pull_request\""
        );
    }

    #[test]
    fn validation_target_revision_round_trips_with_kind_tag_and_is_path_free() {
        let target = ValidationTarget::Revision {
            revision_id: RevisionId::new("rev:sha256:def"),
        };

        let value = serde_json::to_value(&target).unwrap();
        assert_eq!(value["kind"], "revision");
        assert_eq!(value["revisionId"], "rev:sha256:def");

        let back: ValidationTarget = serde_json::from_value(value).unwrap();
        assert_eq!(back, target);
    }
}