openapi-merge 0.1.4

OpenAPI Merge library
Documentation
use super::*;

#[derive(Debug, Default, Deserialize)]
pub struct MergeConfig {
    pub inputs: Vec<Input>,
    pub output: PathBuf,
    #[serde(skip)]
    pub source: PathBuf,
    #[serde(skip)]
    pub load_time: time::Duration,
    #[serde(skip)]
    pub merged: OpenAPI,
    #[serde(skip)]
    pub merge_time: time::Duration,
    #[serde(skip)]
    pub save_time: time::Duration,
}

impl MergeConfig {
    pub fn from_path(path: impl AsRef<Path>) -> io::Result<Self> {
        let now = time::Instant::now();
        let source = path.as_ref().to_path_buf();
        let config = load_json_file(path)?;
        let load_time = now.elapsed();

        Ok(Self {
            source,
            load_time,
            ..config
        })
    }

    pub fn into_merge(self) -> Merge {
        self.into()
    }

    pub fn load_inputs(self) -> io::Result<Self> {
        let base = self.source.parent().unwrap_or(Path::new("."));

        self.inputs
            .into_iter()
            .map(|input| input.load(base))
            .collect::<io::Result<Vec<_>>>()
            .map(|inputs| Self { inputs, ..self })
    }

    pub fn output(&self) -> PathBuf {
        self.source
            .parent()
            .unwrap_or(Path::new("."))
            .join(&self.output)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    use pretty_assertions::assert_eq;

    const CONFIG: &str = r#"
{
  "inputs": [
    {
      "inputFile": "./base/openapi.json",
      "operationSelection": {
        "excludeTags": [
          "deprecated"
        ]
      }
    },
    {
      "inputFile": "./mod1/openapi.json"
    },
    {
      "inputFile": "./mod2/openapi.json"
    }
  ],
  "output": "./rest-api/user-facing-openapi.json"
}
"#;
    #[test]
    fn merge_config_deserialize() {
        let config: MergeConfig = json::from_str(CONFIG).unwrap();
        assert_eq!(config.inputs.len(), 3);
    }
}