use crate::common::helpers::{Context, PushError, ValidateWithContext};
use crate::v3_1::server::Server;
use crate::v3_1::spec::Spec;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Link {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "operationRef")]
pub operation_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "operationId")]
pub operation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<BTreeMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "requestBody")]
pub request_body: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server: Option<Server>,
#[serde(flatten)]
#[serde(with = "crate::common::extensions")]
#[serde(skip_serializing_if = "Option::is_none")]
pub extensions: Option<BTreeMap<String, serde_json::Value>>,
}
impl ValidateWithContext<Spec> for Link {
fn validate_with_context(&self, ctx: &mut Context<Spec>, path: String) {
if let Some(operation_id) = &self.operation_id
&& !ctx
.visited
.contains(format!("#/paths/operations/{operation_id}").as_str())
{
ctx.error(
path.clone(),
format_args!(".operationId: missing operation with id `{operation_id}`"),
);
}
if let Some(server) = &self.server {
server.validate_with_context(ctx, format!("{path}.server"));
}
}
}