use crate::{
cli::Cli,
fs::write,
generate::{errors::ParameterError, makefiles::MakefileEnv},
testing,
};
use fs_err::tokio as fs;
use serde::{Deserialize, Serialize};
use serde_yaml::Error as SerdeYAMLError;
use std::io::Error as IOError;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum YAMLGenerationError {
#[error(transparent)]
IOError(#[from] IOError),
#[error(transparent)]
SerdeYAMLError(#[from] SerdeYAMLError),
#[error(transparent)]
ParameterError(#[from] ParameterError),
}
#[derive(Debug, Deserialize, Serialize)]
#[allow(non_snake_case)]
pub struct OpenAPIRustGeneratorConfigs {
pub bestFitInt: bool,
pub enumNameSuffix: String,
pub hideGenerationTimestamp: bool,
pub library: String,
pub packageName: String,
pub packageVersion: String,
pub preferUnsignedInt: bool,
pub supportAsync: bool,
pub supportMiddleware: bool,
pub supportMultipleResponses: bool,
pub useSingleRequestParameter: bool,
pub withAWSV4Signature: bool,
}
impl Default for OpenAPIRustGeneratorConfigs {
fn default() -> Self {
Self {
bestFitInt: false,
enumNameSuffix: Default::default(),
hideGenerationTimestamp: true,
library: "reqwest".to_string(),
packageName: "openapi".to_string(),
packageVersion: "1.0.0".to_string(),
preferUnsignedInt: false,
supportAsync: true,
supportMiddleware: false,
supportMultipleResponses: false,
useSingleRequestParameter: false,
withAWSV4Signature: false,
}
}
}
impl OpenAPIRustGeneratorConfigs {
pub fn new(cli: &Cli) -> Self {
Self {
packageName: cli.get_lib_name(),
..Default::default()
}
}
pub async fn copy_spec_file(
&self,
cli: &Cli,
) -> Result<(), YAMLGenerationError> {
if let Some(local_api_spec_filepath) = cli.inner_cli.local_api_spec_filepath_opt.as_ref() {
let spec_file_name = cli.try_get_spec_file_name()?;
let contents = fs::read(local_api_spec_filepath).await?;
write(spec_file_name, contents, Some("Copy spec file")).await?;
Ok(())
} else {
Ok(())
}
}
pub async fn write_to_yaml_file(
&self,
cli: &Cli,
) -> Result<(), YAMLGenerationError> {
let output_dir = cli.get_output_project_dir();
let output_file_name = MakefileEnv::OPEN_API_GENERATOR_CONFIG_FILE;
let output_file_path = output_dir.join(output_file_name);
write(
output_file_path,
serde_yaml::to_string(self)?,
Some("OpenAPI rust generator configs"),
)
.await?;
Ok(())
}
}
pub async fn create_testing_spec_file(cli: &Cli) -> Result<(), YAMLGenerationError> {
let petstore_yaml: &'static str = testing::PETSTORE_YAML;
let output_file_path = cli
.inner_cli
.local_api_spec_filepath_opt
.clone()
.ok_or_else(|| {
YAMLGenerationError::ParameterError(ParameterError::TestingYAMLSpecPathMissing)
})?;
write(
&output_file_path,
petstore_yaml,
Some("Created source OpenAPI testing YAML"),
)
.await?;
Ok(())
}