anicca 0.1.0

Libary and CLI to diff two OpenAPI description documents
Documentation
use super::response::ResponseDiff;
use crate::openapi::{ReferenceOr, Response, Responses, StatusCode};
use serde::Serialize;
use std::collections::HashMap;

type ResponseCodePair = (StatusCode, ReferenceOr<Response>);

#[derive(Debug, Serialize)]
pub struct ResponsesDiff {
    pub added: Vec<ResponseCodePair>,
    pub removed: Vec<ResponseCodePair>,
    pub changed: HashMap<StatusCode, ResponseDiff>,
}

impl ResponsesDiff {
    pub fn has_changes(&self) -> bool {
        !self.added.is_empty() || !self.removed.is_empty() || !self.changed.is_empty()
    }

    pub fn from_responses(base: &Responses, head: &Responses) -> Self {
        let mut responses_added = vec![];
        let mut responses_removed = vec![];
        let mut responses_changed: HashMap<StatusCode, ResponseDiff> = HashMap::new();

        for (status_code, response) in &base.responses {
            match head.responses.get(status_code) {
                Some(head_response) => {
                    let response_diff = ResponseDiff::from_responses(&response, &head_response);

                    if response_diff.has_changes() {
                        responses_changed.insert(status_code.clone(), response_diff);
                    }
                }
                None => responses_removed.push((status_code.clone(), response.clone())),
            }
        }

        for (status_code, response) in &head.responses {
            match base.responses.get(status_code) {
                Some(_) => {}
                None => responses_added.push((status_code.clone(), response.clone())),
            }
        }

        Self {
            added: responses_added,
            removed: responses_removed,
            changed: responses_changed,
        }
    }
}