#![expect(clippy::new_ret_no_self)]
use std::marker::PhantomData;
use crate::__private_types::IvoInputStruct;
use crate::schema::options::types::{
IgnoreOptionConfig, IgnoreUpdateOptionConfig, RequiredOptionConfig,
};
use crate::types::internal::IvoStruct;
use crate::{
schema::{
options::types::{OnSuccessConfig, PostValidationConfig},
types::DeleteHandler,
No,
},
IvoErrorSanitizer,
};
pub struct SchemaOptions<
I: IvoInputStruct<CtxOptions, ErrorSanitizer>,
O: IvoStruct,
CtxOptions,
ErrorSanitizer: IvoErrorSanitizer<CtxOptions>,
> {
pub ignore: Option<Vec<IgnoreOptionConfig<I, O, CtxOptions>>>,
pub ignore_update: Option<Vec<IgnoreUpdateOptionConfig<I, O, CtxOptions>>>,
pub on_delete_fns: Option<Vec<DeleteHandler<O, CtxOptions>>>,
pub on_success_fns: Option<Vec<OnSuccessConfig<I, O, CtxOptions>>>,
pub post_validate: Option<Vec<PostValidationConfig<I, O, CtxOptions, ErrorSanitizer>>>,
pub required: Option<Vec<RequiredOptionConfig<I, O, CtxOptions, ErrorSanitizer>>>,
}
impl<
I: IvoInputStruct<CtxOptions, ErrorSanitizer>,
O: IvoStruct,
CtxOptions,
ErrorSanitizer: IvoErrorSanitizer<CtxOptions>,
> SchemaOptions<I, O, CtxOptions, ErrorSanitizer>
{
pub const fn new() -> SchemaOptionsBuilder<I, O, CtxOptions, ErrorSanitizer> {
SchemaOptionsBuilder::new()
}
}
pub struct SchemaOptionsBuilder<
I: IvoInputStruct<CtxOptions, ErrorSanitizer>,
O: IvoStruct,
CtxOptions,
ErrorSanitizer: IvoErrorSanitizer<CtxOptions>,
HasPostValidate = No,
HasDelete = No,
HasSuccess = No,
HasIgnore = No,
HasIgnoreUpdate = No,
HasRequired = No,
> {
pub(crate) ignore: Option<Vec<IgnoreOptionConfig<I, O, CtxOptions>>>,
pub(crate) ignore_update: Option<Vec<IgnoreUpdateOptionConfig<I, O, CtxOptions>>>,
pub(crate) on_delete_fns: Option<Vec<DeleteHandler<O, CtxOptions>>>,
pub(crate) on_success_fns: Option<Vec<OnSuccessConfig<I, O, CtxOptions>>>,
pub(crate) post_validate: Option<Vec<PostValidationConfig<I, O, CtxOptions, ErrorSanitizer>>>,
pub(crate) required: Option<Vec<RequiredOptionConfig<I, O, CtxOptions, ErrorSanitizer>>>,
_on_delete_fns: PhantomData<HasDelete>,
_on_success_fns: PhantomData<HasSuccess>,
_post_validate: PhantomData<HasPostValidate>,
_ignore: PhantomData<HasIgnore>,
_ignore_update: PhantomData<HasIgnoreUpdate>,
_required: PhantomData<HasRequired>,
}
impl<
HasPostValidate,
HasDelete,
HasSuccess,
HasIgnore,
HasIgnoreUpdate,
HasRequired,
I: IvoInputStruct<CtxOptions, ErrorSanitizer>,
O: IvoStruct,
CtxOptions,
ErrorSanitizer: IvoErrorSanitizer<CtxOptions>,
>
SchemaOptionsBuilder<
I,
O,
CtxOptions,
ErrorSanitizer,
HasPostValidate,
HasDelete,
HasSuccess,
HasIgnore,
HasIgnoreUpdate,
HasRequired,
>
{
pub const fn new() -> Self {
Self {
ignore: None,
ignore_update: None,
on_delete_fns: None,
on_success_fns: None,
post_validate: None,
required: None,
_on_delete_fns: PhantomData,
_on_success_fns: PhantomData,
_post_validate: PhantomData,
_ignore: PhantomData,
_ignore_update: PhantomData,
_required: PhantomData,
}
}
pub fn from(
ignore: Option<Vec<IgnoreOptionConfig<I, O, CtxOptions>>>,
ignore_update: Option<Vec<IgnoreUpdateOptionConfig<I, O, CtxOptions>>>,
on_delete_fns: Option<Vec<DeleteHandler<O, CtxOptions>>>,
on_success_fns: Option<Vec<OnSuccessConfig<I, O, CtxOptions>>>,
post_validate: Option<Vec<PostValidationConfig<I, O, CtxOptions, ErrorSanitizer>>>,
required: Option<Vec<RequiredOptionConfig<I, O, CtxOptions, ErrorSanitizer>>>,
) -> Self {
Self {
ignore,
ignore_update,
on_delete_fns,
on_success_fns,
post_validate,
required,
..Default::default()
}
}
}
impl<
HasPostValidate,
HasDelete,
HasSuccess,
HasIgnore,
HasIgnoreUpdate,
HasRequired,
I: IvoInputStruct<CtxOptions, ErrorSanitizer>,
O: IvoStruct,
CtxOptions,
ErrorSanitizer: IvoErrorSanitizer<CtxOptions>,
> Default
for SchemaOptionsBuilder<
I,
O,
CtxOptions,
ErrorSanitizer,
HasPostValidate,
HasDelete,
HasSuccess,
HasIgnore,
HasIgnoreUpdate,
HasRequired,
>
{
fn default() -> Self {
Self::new()
}
}