openapi_merge/
input.rs

1use super::*;
2
3pub use description::Description;
4pub use dispute::Dispute;
5pub use operation::OperationSelection;
6pub use path::PathModification;
7pub use source::InputSource;
8
9mod description;
10mod dispute;
11mod operation;
12mod path;
13mod source;
14
15#[derive(Debug, Deserialize)]
16#[serde(rename_all = "camelCase")]
17pub struct Input {
18    #[serde(flatten)]
19    pub source: InputSource,
20    pub operation_selection: Option<OperationSelection>,
21    pub description: Option<Description>,
22    pub path_modification: Option<PathModification>,
23    #[doc(hidden)]
24    #[serde(skip)]
25    pub openapi: OpenAPI,
26    #[doc(hidden)]
27    #[serde(skip)]
28    pub load_time: time::Duration,
29}
30
31impl Input {
32    pub fn load(self, base: &Path) -> io::Result<Self> {
33        let now = time::Instant::now();
34        let openapi = self.source.load(base)?;
35        let load_time = now.elapsed();
36
37        Ok(Self {
38            openapi,
39            load_time,
40            ..self
41        })
42    }
43
44    pub fn operations(&self) -> impl Iterator<Item = (&str, &str, &openapiv3::Operation)> {
45        self.openapi
46            .operations()
47            .filter(|(_path, _method, operation)| self.filter_operation(operation))
48    }
49
50    fn filter_operation(&self, operation: &openapiv3::Operation) -> bool {
51        self.operation_selection
52            .as_ref()
53            .map_or(true, |selection| selection.filter_operation(operation))
54    }
55
56    pub fn components(&mut self) -> Option<openapiv3::Components> {
57        self.openapi.components.take()
58    }
59
60    pub fn security(&mut self) -> Option<Vec<openapiv3::SecurityRequirement>> {
61        self.openapi.security.take()
62    }
63
64    pub fn tags(&mut self) -> Vec<openapiv3::Tag> {
65        mem::take(&mut self.openapi.tags)
66    }
67
68    pub fn extensions(&mut self) -> indexmap::IndexMap<String, json::Value> {
69        mem::take(&mut self.openapi.extensions)
70    }
71}