ivo 0.4.0

The rust implementation of the ivo schema valitator
Documentation
#![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>>>,
    // markers...
    _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()
    }
}