openapi_nexus_spec/oas31/spec/
header.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6 ErrorRef, Example, FromRef, MediaType, ObjectOrReference, ObjectSchema, OpenApiV31Spec,
7 ParameterStyle, Ref, RefType, spec_extensions,
8};
9
10#[derive(Debug, Clone, Default, PartialEq, Deserialize, Serialize)]
12#[serde(rename_all = "camelCase")]
13pub struct Header {
14 #[serde(skip_serializing_if = "Option::is_none")]
15 pub description: Option<String>,
16
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub required: Option<bool>,
19
20 #[serde(default, skip_serializing_if = "Option::is_none")]
21 pub deprecated: Option<bool>,
22
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub style: Option<ParameterStyle>,
25
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub explode: Option<bool>,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub schema: Option<ObjectOrReference<ObjectSchema>>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub example: Option<serde_json::Value>,
34
35 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
36 pub examples: BTreeMap<String, ObjectOrReference<Example>>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub content: Option<BTreeMap<String, MediaType>>,
40
41 #[serde(flatten, with = "spec_extensions")]
42 pub extensions: BTreeMap<String, serde_json::Value>,
43}
44
45impl FromRef for Header {
46 fn from_ref(spec: &OpenApiV31Spec, path: &str) -> Result<Self, ErrorRef> {
47 let refpath = path.parse::<Ref>()?;
48
49 match refpath.kind {
50 RefType::Header => spec
51 .components
52 .as_ref()
53 .and_then(|cs| cs.headers.get(&refpath.name))
54 .ok_or_else(|| ErrorRef::Unresolvable {
55 path: path.to_owned(),
56 })
57 .and_then(|oor| oor.resolve(spec)),
58
59 typ => Err(ErrorRef::MismatchedType {
60 expected: typ,
61 actual: RefType::Header,
62 }),
63 }
64 }
65}