1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use std::collections::BTreeMap;

use apistos_models::paths::{MediaType, Response, Responses};
use apistos_models::reference_or::ReferenceOr;
use apistos_models::{ApistosSchema, OpenApiVersion, VersionSpecificSchema};

pub fn response_from_schema(
  oas_version: OpenApiVersion,
  status: &str,
  schema: Option<(String, ReferenceOr<ApistosSchema>)>,
) -> Option<Responses> {
  schema.map(|(name, schema)| match schema {
    ReferenceOr::Reference { _ref } => Responses {
      responses: BTreeMap::from_iter(vec![(status.to_string(), ReferenceOr::Reference { _ref })]),
      ..Default::default()
    },
    ReferenceOr::Object(sch) => {
      let schema = match oas_version {
        OpenApiVersion::OAS3_0 => VersionSpecificSchema::OAS3_0(ReferenceOr::Reference {
          _ref: format!("#/components/schemas/{}", name),
        }),
        OpenApiVersion::OAS3_1 => VersionSpecificSchema::OAS3_1(sch),
      };
      let response = Response {
        content: BTreeMap::from_iter(vec![(
          "application/json".to_string(),
          MediaType {
            schema: Some(schema),
            ..Default::default()
          },
        )]),
        ..Default::default()
      };
      Responses {
        responses: BTreeMap::from_iter(vec![(status.to_string(), ReferenceOr::Object(response))]),
        ..Default::default()
      }
    }
  })
}

pub fn response_from_raw_schema(
  oas_version: OpenApiVersion,
  status: &str,
  raw_schema: Option<ReferenceOr<ApistosSchema>>,
) -> Option<Responses> {
  raw_schema.map(|schema| match schema {
    ReferenceOr::Reference { _ref } => Responses {
      responses: BTreeMap::from_iter(vec![(status.to_string(), ReferenceOr::Reference { _ref })]),
      ..Default::default()
    },
    ReferenceOr::Object(sch) => {
      let schema = match oas_version {
        OpenApiVersion::OAS3_0 => VersionSpecificSchema::OAS3_0(sch.into()),
        OpenApiVersion::OAS3_1 => VersionSpecificSchema::OAS3_1(sch),
      };
      let response = Response {
        content: BTreeMap::from_iter(vec![(
          "application/json".to_string(),
          MediaType {
            schema: Some(schema),
            ..Default::default()
          },
        )]),
        ..Default::default()
      };
      Responses {
        responses: BTreeMap::from_iter(vec![(status.to_string(), ReferenceOr::Object(response))]),
        ..Default::default()
      }
    }
  })
}

pub fn response_for_status(status: &str) -> Responses {
  Responses {
    responses: BTreeMap::from_iter(vec![(status.to_string(), ReferenceOr::Object(Default::default()))]),
    ..Default::default()
  }
}