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}