pointbreak 0.5.0

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

use super::review_note::{push_normalized_line, sha256_prefixed};
use super::{DiffRow, DiffRowKind, HunkId};

#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ReviewHunk {
    pub id: HunkId,
    pub header: String,
    pub old_start: u32,
    pub old_lines: u32,
    pub new_start: u32,
    pub new_lines: u32,
    pub rows: Vec<DiffRow>,
}

impl ReviewHunk {
    pub fn signature(&self) -> String {
        hunk_signature(self)
    }
}

fn hunk_signature(hunk: &ReviewHunk) -> String {
    let mut payload = String::new();
    push_normalized_line(&mut payload, &hunk_header_range(&hunk.header));
    for row in &hunk.rows {
        let marker = match row.kind {
            DiffRowKind::Added => '+',
            DiffRowKind::Removed => '-',
            DiffRowKind::Context => continue,
        };
        let mut line = String::new();
        line.push(marker);
        line.push_str(&row.text);
        push_normalized_line(&mut payload, &line);
    }
    sha256_prefixed(&payload)
}

fn hunk_header_range(header: &str) -> String {
    let mut parts = header.splitn(3, "@@");
    if parts.next() == Some("")
        && let Some(range) = parts.next()
    {
        return format!("@@{range}@@");
    }
    header.to_owned()
}