use crate::errors::{self, Result};
use crate::scenario_config::{
ScenarioConfig, find_scenario_by_name_with_config, find_scenario_for_message_type_with_config,
};
use crate::swift_message::SwiftMessage;
use crate::traits::SwiftMessageBody;
use datafake_rs::DataGenerator;
use std::path::PathBuf;
pub fn generate_sample_with_config<T>(
message_type: &str,
scenario_name: Option<&str>,
config: &ScenarioConfig,
) -> Result<SwiftMessage<T>>
where
T: SwiftMessageBody + serde::de::DeserializeOwned,
{
let scenario_json = if let Some(name) = scenario_name {
find_scenario_by_name_with_config(message_type, name, config)?
} else {
find_scenario_for_message_type_with_config(message_type, config)?
};
let generator = DataGenerator::from_value(scenario_json).map_err(|e| {
errors::ParseError::InvalidFormat {
message: format!("Failed to create datafake generator: {e:?}"),
}
})?;
let generated_data = generator
.generate()
.map_err(|e| errors::ParseError::InvalidFormat {
message: format!("datafake-rs generation failed: {e:?}"),
})?;
let generated_json = serde_json::to_string_pretty(&generated_data).map_err(|e| {
errors::ParseError::InvalidFormat {
message: format!("Failed to serialize generated data: {e}"),
}
})?;
serde_json::from_str(&generated_json).map_err(|e| errors::ParseError::InvalidFormat {
message: format!("Failed to parse generated JSON into SwiftMessage<{message_type}>: {e}"),
})
}
pub fn generate_sample<T>(
message_type: &str,
scenario_name: Option<&str>,
) -> Result<SwiftMessage<T>>
where
T: SwiftMessageBody + serde::de::DeserializeOwned,
{
generate_sample_with_config(message_type, scenario_name, &ScenarioConfig::default())
}
#[derive(Debug, Clone)]
pub struct SampleGenerator {
config: ScenarioConfig,
}
impl Default for SampleGenerator {
fn default() -> Self {
Self::new()
}
}
impl SampleGenerator {
pub fn new() -> Self {
Self {
config: ScenarioConfig::default(),
}
}
pub fn with_config(config: ScenarioConfig) -> Self {
Self { config }
}
pub fn with_path(mut self, path: PathBuf) -> Self {
self.config = self.config.add_path(path);
self
}
pub fn with_paths(mut self, paths: Vec<PathBuf>) -> Self {
self.config = self.config.set_paths(paths);
self
}
pub fn generate<T>(
&self,
message_type: &str,
scenario_name: Option<&str>,
) -> Result<SwiftMessage<T>>
where
T: SwiftMessageBody + serde::de::DeserializeOwned,
{
generate_sample_with_config(message_type, scenario_name, &self.config)
}
pub fn config(&self) -> &ScenarioConfig {
&self.config
}
}