use crate::generator::fragment::{
clone::CloneImplGenerator,
from_previous_record_unnamed_fields_impls::FromPreviousRecordUnnamedFieldsImplsGenerator,
from_unnamed_fields_impls::FromUnnamedFieldsImplsGenerator,
record_unnamed_impl::RecordUnnamedImplGenerator, serde::SerdeImplGenerator,
};
use super::fragment::{
data_records::DataRecordsGenerator, drop_impl::DropImplGenerator,
from_previous_record_data_records::FromPreviousRecordDataRecordsGenerator,
from_previous_record_impls::FromPreviousRecordImplsGenerator,
from_unpacked_record_impls::FromUnpackedRecordImplsGenerator, record::RecordGenerator,
record_impl::RecordImplGenerator, FragmentGenerator,
};
pub struct GeneratorConfig {
pub(crate) fragment_generators: Vec<Box<dyn FragmentGenerator>>,
}
impl GeneratorConfig {
pub fn new(fragment_generators: impl IntoIterator<Item = Box<dyn FragmentGenerator>>) -> Self {
Self {
fragment_generators: fragment_generators.into_iter().collect(),
}
}
pub fn with_fragment_generators(
mut self,
fragment_generators: impl IntoIterator<Item = Box<dyn FragmentGenerator>>,
) -> Self {
self.fragment_generators.extend(fragment_generators);
self
}
pub fn with_common_fragments(self) -> Self {
self.with_fragment_generators([
Box::new(DataRecordsGenerator),
Box::new(RecordGenerator),
Box::new(RecordImplGenerator),
Box::new(DropImplGenerator),
Box::new(FromUnpackedRecordImplsGenerator),
Box::new(FromPreviousRecordDataRecordsGenerator),
Box::new(FromPreviousRecordImplsGenerator),
] as [Box<dyn FragmentGenerator>; 7])
}
pub fn with_unnamed_fields_fragments(self) -> Self {
self.with_fragment_generators([
Box::new(RecordUnnamedImplGenerator),
Box::new(FromUnnamedFieldsImplsGenerator),
Box::new(FromPreviousRecordUnnamedFieldsImplsGenerator),
] as [Box<dyn FragmentGenerator>; 3])
}
pub fn with_clone_fragments(self) -> Self {
self.with_fragment_generators(
[Box::new(CloneImplGenerator)] as [Box<dyn FragmentGenerator>; 1]
)
}
pub fn with_serde_fragments(self) -> Self {
self.with_fragment_generators(
[Box::new(SerdeImplGenerator)] as [Box<dyn FragmentGenerator>; 1]
)
}
}
impl Default for GeneratorConfig {
fn default() -> Self {
Self {
fragment_generators: Vec::new(),
}
.with_common_fragments()
}
}