anicca 0.1.0

Libary and CLI to diff two OpenAPI description documents
Documentation
use super::content::ContentDiff;
use crate::openapi::{ReferenceOr, RequestBody};
use serde::Serialize;

#[derive(Debug, Serialize)]
pub struct RequestBodyDiff {
    pub added: Option<ReferenceOr<RequestBody>>,
    pub removed: Option<ReferenceOr<RequestBody>>,
    pub content_changed: Option<ContentDiff>,
}

impl RequestBodyDiff {
    pub fn has_changes(&self) -> bool {
        self.added.is_some() || self.removed.is_some() || self.content_changed.is_some()
    }

    pub fn from_request_bodies(
        base: &Option<ReferenceOr<RequestBody>>,
        head: &Option<ReferenceOr<RequestBody>>,
    ) -> Self {
        match base {
            Some(base) => match head {
                Some(head) => {
                    let derefed_base = match &base {
                        ReferenceOr::Item(bc) => bc,
                        ReferenceOr::Reference { reference: _ } => {
                            panic!("$ref not supported yet");
                        }
                    };

                    let derefed_head = match &head {
                        ReferenceOr::Item(pi) => pi,
                        ReferenceOr::Reference { reference: _ } => {
                            panic!("$ref not supported yet");
                        }
                    };

                    let mut diff = Self {
                        added: None,
                        removed: None,
                        content_changed: None,
                    };

                    let content_diff =
                        ContentDiff::from_content(&derefed_base.content, &derefed_head.content);

                    if content_diff.has_changes() {
                        diff.content_changed = Some(content_diff);
                    }

                    diff
                }
                None => Self {
                    added: None,
                    removed: Some(base.clone()),
                    content_changed: None,
                },
            },
            None => match head {
                Some(head) => Self {
                    added: Some(head.clone()),
                    removed: None,
                    content_changed: None,
                },
                None => Self {
                    added: None,
                    removed: None,
                    content_changed: None,
                },
            },
        }
    }
}