use indexmap::IndexMap;
use serde_derive::{Deserialize, Serialize};
use super::Server;
use super::extensions::Extensions;
#[derive(Serialize, Deserialize, Clone, PartialEq, Default, bon::Builder)]
#[cfg_attr(feature = "debug", derive(Debug))]
#[builder(on(_, into))]
#[non_exhaustive]
pub struct Link {
#[serde(skip_serializing_if = "IndexMap::is_empty", default)]
#[builder(field)]
pub parameters: IndexMap<String, serde_json::Value>,
#[serde(skip_serializing_if = "String::is_empty", default)]
#[builder(default)]
pub operation_ref: String,
#[serde(skip_serializing_if = "String::is_empty", default)]
#[builder(default)]
pub operation_id: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub request_body: Option<serde_json::Value>,
#[serde(skip_serializing_if = "String::is_empty", default)]
#[builder(default)]
pub description: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub server: Option<Server>,
#[serde(skip_serializing_if = "Option::is_none", default, flatten)]
pub extensions: Option<Extensions>,
}
impl<S: link_builder::State> LinkBuilder<S> {
pub fn parameters<N: Into<String>, V: Into<serde_json::Value>>(self, items: impl IntoIterator<Item = (N, V)>) -> Self {
items.into_iter().fold(self, |this, (n, v)| this.parameter(n, v))
}
pub fn parameter<N: Into<String>, V: Into<serde_json::Value>>(mut self, name: N, value: V) -> Self {
self.parameters.insert(name.into(), value.into());
self
}
}
impl<S: link_builder::IsComplete> From<LinkBuilder<S>> for Link {
fn from(builder: LinkBuilder<S>) -> Self {
builder.build()
}
}