use std::marker::PhantomData;
use crate::{
schema::{
error_tool::IvoErrorTool,
fields::{
base::{BuildableFieldConfig, FieldConfig, FieldType, InternalFieldConfig},
types::{
BooleanResolver, ComputableInit, IntoFailureHandler, IntoFieldValidator,
IntoRequiredResolver, IntoResolver, IntoSuccessHandler, IntoVirtualSanitizer,
RequiredResolver, UniformValidator, VirtualSanitizer,
},
},
},
types::{ErasedValue, FailureHandler, IvoFieldValue, No, SuccessHandler, Yes, YesComputed},
IvoSchemaStruct,
};
pub struct VirtualFieldBuilder<
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
HasValidator = No,
HasAlias = No,
HasRevalidator = No,
HasSanitizer = No,
HasRequired = No,
HasIgnore = No,
HasShouldInit = No,
HasShouldUpdate = No,
HasFailure = No,
HasSuccess = No,
> {
_t: PhantomData<T>,
_alias: PhantomData<HasAlias>,
_validator: PhantomData<HasValidator>,
_re_validator: PhantomData<HasRevalidator>,
_required_fn: PhantomData<HasRequired>,
_sanitizer_fn: PhantomData<HasSanitizer>,
_should_ignore: PhantomData<HasIgnore>,
_should_init: PhantomData<HasShouldInit>,
_should_update: PhantomData<HasShouldUpdate>,
_on_failure_fns: PhantomData<HasFailure>,
_on_success_fns: PhantomData<HasSuccess>,
alias: Option<String>,
validator: Option<UniformValidator<I, O, CtxOptions, ErrorTool::FieldMetadata>>,
re_validator: Option<UniformValidator<I, O, CtxOptions, ErrorTool::FieldMetadata>>,
required_fn: Option<RequiredResolver<I, O, CtxOptions>>,
sanitizer: Option<VirtualSanitizer<ErasedValue, I, O, CtxOptions>>,
should_ignore_fn: Option<BooleanResolver<I, O, CtxOptions>>,
should_init: Option<ComputableInit<I, O, CtxOptions>>,
should_update: Option<ComputableInit<I, O, CtxOptions>>,
on_failure_fns: Option<Vec<FailureHandler<I, O, CtxOptions>>>,
on_success_fns: Option<Vec<SuccessHandler<I, O, CtxOptions>>>,
}
impl<
HasValidator,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
HasValidator,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
>
{
pub const fn new() -> Self {
Self {
alias: None,
validator: None,
re_validator: None,
required_fn: None,
sanitizer: None,
should_ignore_fn: None,
should_init: None,
should_update: None,
on_failure_fns: None,
on_success_fns: None,
_t: PhantomData,
_alias: PhantomData,
_validator: PhantomData,
_re_validator: PhantomData,
_required_fn: PhantomData,
_sanitizer_fn: PhantomData,
_should_ignore: PhantomData,
_should_init: PhantomData,
_should_update: PhantomData,
_on_failure_fns: PhantomData,
_on_success_fns: PhantomData,
}
}
}
impl<
HasValidator,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> Default
for VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
HasValidator,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
>
{
fn default() -> Self {
Self::new()
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> BuildableFieldConfig<I, O, CtxOptions, ErrorTool>
for VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
>
{
fn build(self) -> InternalFieldConfig<I, O, CtxOptions, ErrorTool> {
FieldConfig {
field_type: FieldType::Virtual,
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_ignore: self.should_ignore_fn,
should_init: self.should_init,
should_update: self.should_update,
on_failure_fns: self.on_failure_fns,
on_success_fns: self.on_success_fns,
..Default::default()
}
}
}
impl<
HasValidator,
HasRevalidator,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, HasValidator, No, HasRevalidator>
{
pub fn alias(
self,
name: &str,
) -> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, HasValidator, Yes> {
VirtualFieldBuilder {
alias: Some(name.to_string()),
validator: self.validator,
re_validator: self.re_validator,
sanitizer: self.sanitizer,
required_fn: self.required_fn,
should_ignore_fn: self.should_ignore_fn,
should_init: self.should_init,
should_update: self.should_update,
on_failure_fns: self.on_failure_fns,
on_success_fns: self.on_success_fns,
..Default::default()
}
}
}
impl<
HasAlias,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, No, HasAlias>
{
pub fn validate<F>(
self,
validator: F,
) -> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, Yes, HasAlias>
where
F: IntoFieldValidator<T, I, O, CtxOptions, ErrorTool>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: Some(validator.into_uniform()),
..Default::default()
}
}
}
impl<
HasAlias,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, Yes, HasAlias>
{
pub fn re_validate<F>(
self,
re_validator: F,
) -> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, Yes, HasAlias, Yes>
where
F: IntoFieldValidator<T, I, O, CtxOptions, ErrorTool>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: Some(re_validator.into_uniform()),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, Yes, HasAlias, HasRevalidator>
{
pub fn required_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<T, I, O, CtxOptions, ErrorTool, Yes, HasAlias, HasRevalidator, No, Yes>
where
R: IntoRequiredResolver<I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: Some(resolver.into_resolver()),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
No,
HasRequired,
>
{
pub fn sanitize<F>(
self,
sanitizer: F,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
Yes,
HasRequired,
>
where
F: IntoVirtualSanitizer<T, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: Some(sanitizer.into_uniform()),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
>
{
pub fn ignore_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
Yes,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_ignore_fn: Some(resolver.into_resolver()),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
>
{
pub fn ignore_init(
self,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
Yes,
> {
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_init: Some(ComputableInit::False),
..Default::default()
}
}
pub fn allow_init_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
YesComputed,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_init: Some(ComputableInit::Func(resolver.into_resolver())),
..Default::default()
}
}
pub fn ignore_update(
self,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
No,
Yes,
> {
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_update: Some(ComputableInit::False),
..Default::default()
}
}
pub fn allow_update_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
No,
YesComputed,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_init: Some(ComputableInit::Func(resolver.into_resolver())),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
No,
Yes,
>
{
pub fn allow_init_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
YesComputed,
Yes,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_init: Some(ComputableInit::Func(resolver.into_resolver())),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
Yes,
YesComputed,
>
{
pub fn allow_update_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
Yes,
YesComputed,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_init: self.should_init,
should_update: Some(ComputableInit::Func(resolver.into_resolver())),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
No,
YesComputed,
>
{
pub fn ignore_init(
self,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
Yes,
YesComputed,
> {
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_update: self.should_update,
should_init: Some(ComputableInit::False),
..Default::default()
}
}
pub fn allow_init_if<R>(
self,
resolver: R,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
No,
YesComputed,
YesComputed,
>
where
R: IntoResolver<bool, I, O, CtxOptions>,
{
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
required_fn: self.required_fn,
sanitizer: self.sanitizer,
should_update: self.should_update,
should_init: Some(ComputableInit::Func(resolver.into_resolver())),
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
>
{
pub fn on_failure<H>(
self,
handler: H,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
Yes,
HasSuccess,
>
where
H: IntoFailureHandler<I, O, CtxOptions>,
{
let h = handler.into_handler();
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
sanitizer: self.sanitizer,
required_fn: self.required_fn,
should_ignore_fn: self.should_ignore_fn,
should_init: self.should_init,
should_update: self.should_update,
on_failure_fns: Some(match self.on_failure_fns {
Some(hs) => {
let mut v = hs;
v.push(h);
v
}
_ => vec![h],
}),
on_success_fns: self.on_success_fns,
..Default::default()
}
}
}
impl<
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
T: IvoFieldValue,
I: IvoSchemaStruct,
O: IvoSchemaStruct,
CtxOptions,
ErrorTool: IvoErrorTool,
>
VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
HasSuccess,
>
{
pub fn on_success<H>(
self,
handler: H,
) -> VirtualFieldBuilder<
T,
I,
O,
CtxOptions,
ErrorTool,
Yes,
HasAlias,
HasRevalidator,
HasSanitizer,
HasRequired,
HasIgnore,
HasShouldInit,
HasShouldUpdate,
HasFailure,
Yes,
>
where
H: IntoSuccessHandler<I, O, CtxOptions>,
{
let h = handler.into_handler();
VirtualFieldBuilder {
alias: self.alias,
validator: self.validator,
re_validator: self.re_validator,
sanitizer: self.sanitizer,
required_fn: self.required_fn,
should_ignore_fn: self.should_ignore_fn,
should_init: self.should_init,
should_update: self.should_update,
on_failure_fns: self.on_failure_fns,
on_success_fns: Some(match self.on_success_fns {
Some(hs) => {
let mut v = hs;
v.push(h);
v
}
_ => vec![h],
}),
..Default::default()
}
}
}