Skip to main content

openapi_nexus_spec/oas30/spec/
header.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use super::{
6    ErrorRef, Example, FromRef, MediaType, ObjectOrReference, ObjectSchema, OpenApiV30Spec,
7    ParameterStyle, Ref, RefType, spec_extensions,
8};
9
10/// Describes a single header for HTTP responses.
11#[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: &OpenApiV30Spec, 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}