httpgenerator 1.1.0

Generate .http files from OpenAPI specifications
Documentation
use std::{
    fs,
    path::{Path, PathBuf},
    sync::mpsc,
    thread,
    time::Duration,
};

use httpgenerator_core::HttpFile;

use crate::CliError;

pub(crate) fn write_files(
    output_folder: &Path,
    files: Vec<HttpFile>,
    timeout_seconds: u64,
) -> Result<Vec<PathBuf>, CliError> {
    if !output_folder.exists() {
        fs::create_dir_all(output_folder).map_err(|error| CliError::CreateOutputDirectory {
            path: output_folder.to_path_buf(),
            reason: error.to_string(),
        })?;
    }

    let output_folder = output_folder.to_path_buf();
    let (sender, receiver) = mpsc::channel();

    thread::spawn({
        let output_folder = output_folder.clone();
        move || {
            let result = write_files_worker(&output_folder, files);
            let _ = sender.send(result);
        }
    });

    receiver
        .recv_timeout(Duration::from_secs(timeout_seconds))
        .map_err(|error| match error {
            mpsc::RecvTimeoutError::Timeout => CliError::WriteTimeout {
                seconds: timeout_seconds,
            },
            mpsc::RecvTimeoutError::Disconnected => CliError::WriteChannelClosed,
        })?
}

fn write_files_worker(
    output_folder: &Path,
    files: Vec<HttpFile>,
) -> Result<Vec<PathBuf>, CliError> {
    let mut written_paths = Vec::with_capacity(files.len());

    for file in files {
        let path = output_folder.join(&file.filename);
        fs::write(&path, file.content).map_err(|error| CliError::WriteFiles {
            path: path.clone(),
            reason: error.to_string(),
        })?;
        written_paths.push(path);
    }

    Ok(written_paths)
}