gproxy-protocol 4.1.2

GPROXY v4 connection modelling, operation declarations, vendor wire types and pairwise conversion
Documentation
use crate::{
    transform::TransformError,
    wire::claude::stream::{MessageDeltaEvent, StreamMessage},
};

pub(super) fn merge(m: &mut StreamMessage, e: MessageDeltaEvent) -> Result<(), TransformError> {
    if let Some(old) = m.stop_reason.flatten()
        && e.delta.stop_reason.is_some_and(|new| new != Some(old))
    {
        return Err(super::collector::invalid(
            "stop_reason",
            "terminal reason cannot change or clear",
        ));
    }

    if e.delta.stop_reason.is_some() {
        m.stop_reason = e.delta.stop_reason;
    }
    if e.delta.stop_sequence.is_some() {
        m.stop_sequence = e.delta.stop_sequence;
    }
    if e.delta.stop_details.is_some() {
        m.stop_details = e.delta.stop_details;
    }
    if e.delta.container.is_some() {
        m.container = e.delta.container;
    }
    if e.input_transformations.is_some() {
        m.input_transformations = e.input_transformations;
    }
    if e.context_management.is_some() {
        m.context_management = e.context_management;
    }
    if let Some(Some(n)) = e.usage.input_tokens {
        m.usage.input_tokens = n;
    }

    m.usage.output_tokens = e.usage.output_tokens;
    if e.usage.cache_creation_input_tokens.is_some() {
        m.usage.cache_creation_input_tokens = e.usage.cache_creation_input_tokens;
    }
    if e.usage.cache_read_input_tokens.is_some() {
        m.usage.cache_read_input_tokens = e.usage.cache_read_input_tokens;
    }
    if e.usage.fallback_credit.is_some() {
        m.usage.fallback_credit = e.usage.fallback_credit;
    }
    if e.usage.iterations.is_some() {
        m.usage.iterations = e.usage.iterations;
    }
    if e.usage.output_tokens_details.is_some() {
        m.usage.output_tokens_details = e.usage.output_tokens_details;
    }
    if e.usage.server_tool_use.is_some() {
        m.usage.server_tool_use = e.usage.server_tool_use;
    }
    Ok(())
}