Form-Tiny

 view release on metacpan or  search on metacpan

lib/Form/Tiny/Form.pm  view on Meta::CPAN

{
	my ($self, $def, $out_ref) = @_;

	my $current = $$out_ref;

	# We got the parameter, now we have to check if it is not empty
	# Even if it is, it may still be handled if isn't hard-required
	if (ref $current || length($current // '') || !$def->hard_required) {

		# coerce, validate, adjust
		$current = $def->get_coerced($self, $current);
		if ($def->validate($self, $current)) {
			$current = $def->get_adjusted($self, $current);
		}

		$$out_ref = $current;

		return 1;
	}

	return;
}

### OPTIMIZATION: detect and use faster route for flat forms

sub _ft_validate_flat
{
	my ($self, $fields, $dirty, $inline_hook) = @_;

	foreach my $validator (@{$self->field_defs}) {
		my $curr_f = $validator->name;

		if (exists $fields->{$curr_f}) {
			$dirty->{$curr_f} = $inline_hook
				? $inline_hook->($self, $validator, $fields->{$curr_f})
				: $fields->{$curr_f}
				;

			next if $self->_ft_mangle_field($validator, \$dirty->{$curr_f});
		}

		# for when it didn't pass the existence test
		if ($validator->has_default) {
			$dirty->{$curr_f} = $validator->get_default($self);
		}
		elsif ($validator->required) {
			$self->add_error($self->form_meta->build_error(Required => field_def => $validator));
		}
	}
}

sub _ft_validate_nested
{
	my ($self, $fields, $dirty, $inline_hook) = @_;

	foreach my $validator (@{$self->field_defs}) {
		my $current_data = Form::Tiny::Utils::_find_field($fields, $validator);
		if (defined $current_data) {
			my $all_ok = 1;

			# This may have multiple iterations only if there's an array
			foreach my $path_value (@$current_data) {
				next if $path_value->[2];

				$path_value->[1] = ($inline_hook->($self, $validator, $path_value->[1]))
					if $inline_hook;
				$all_ok = $self->_ft_mangle_field($validator, \$path_value->[1]) && $all_ok;
			}

			Form::Tiny::Utils::_assign_field($dirty, $validator, $current_data);

			# found and valid, go to the next field
			next if $all_ok;
		}

		# for when it didn't pass the existence test
		if ($validator->has_default) {
			Form::Tiny::Utils::_assign_field(
				$dirty,
				$validator,
				[[$validator->get_name_path->path, $validator->get_default($self)]]
			);
		}
		elsif ($validator->required) {
			$self->add_error($self->form_meta->build_error(Required => field_def => $validator));
		}
	}
}

sub _ft_find_field
{
	my ($self, $name, $raise) = @_;

	my $def = first { $_->name eq $name } @{$self->field_defs};

	if ($raise && !defined $def) {
		croak "form does not contain a field definition for $name";
	}

	return $def;
}

sub valid
{
	my ($self) = @_;
	my $meta = $self->form_meta;
	$self->_ft_clear_errors;

	my %hooks = %{$meta->inline_hooks};
	my $fields = $self->input;
	my $dirty = {};
	if (
		(!$hooks{reformat} || !try sub { $fields = $hooks{reformat}->($self, $fields) })
		&& ref $fields eq 'HASH'
		)
	{
		$hooks{before_validate}->($self, $fields)
			if $hooks{before_validate};

		$meta->is_flat
			? $self->_ft_validate_flat($fields, $dirty, $hooks{before_mangle})



( run in 0.625 second using v1.01-cache-2.11-cpan-71847e10f99 )