pub struct ValidationResult<TData: Clone, E: Debug> {
pub errors: Vec<E>,
pub data: Option<TData>,
}Fields§
§errors: Vec<E>§data: Option<TData>Implementations§
Source§impl<TData: Clone, E: Debug> ValidationResult<Vec<TData>, E>
impl<TData: Clone, E: Debug> ValidationResult<Vec<TData>, E>
Sourcepub fn flatten<I: IntoIterator<Item = ValidationResult<Vec<TData>, E>>>(
items: I,
platform_version: &PlatformVersion,
) -> Result<ValidationResult<Vec<TData>, E>, ProtocolError>
pub fn flatten<I: IntoIterator<Item = ValidationResult<Vec<TData>, E>>>( items: I, platform_version: &PlatformVersion, ) -> Result<ValidationResult<Vec<TData>, E>, ProtocolError>
Aggregate a list of ValidationResult<Vec<TData>, E> into a single
result. Dispatches to the version selected by platform_version:
- v0 (
PROTOCOL_VERSION_11and below): always returnsdata: Some(Vec<...>), includingSome(empty_vec)when no input contributed any data. Preserved for chain reproducibility. - v1 (
PROTOCOL_VERSION_12+): returnsdata: Nonewhen no input contributed any data. Honors the invariantdata.is_none() ⇔ no work done, which downstream code (e.g.process_validation_result_v0:241) relies on to choose betweenPaidConsensusErrorandUnpaidConsensusError.
§v1 caller-intent ambiguity
v1 keys on aggregate_data.is_empty() to decide between
data: None and data: Some(_), which collapses two distinct
caller intents into the same output: every input had data: None
(truly no work) and every input had data: Some(empty_vec)
(validated but produced no output). v1 cannot distinguish those
at the aggregate level — both yield data: None and are routed
to UnpaidConsensusError downstream. Callers that need “validated
but no actions” must signal that with at least one non-empty entry.
See issue #2867 for context on the v0 → v1 change.
Source§impl<TData: Clone, E: Debug> ValidationResult<TData, E>
impl<TData: Clone, E: Debug> ValidationResult<TData, E>
Sourcepub fn merge_many<I: IntoIterator<Item = ValidationResult<TData, E>>>(
items: I,
platform_version: &PlatformVersion,
) -> Result<ValidationResult<Vec<TData>, E>, ProtocolError>
pub fn merge_many<I: IntoIterator<Item = ValidationResult<TData, E>>>( items: I, platform_version: &PlatformVersion, ) -> Result<ValidationResult<Vec<TData>, E>, ProtocolError>
Aggregate a list of ValidationResult<TData, E> into a
ValidationResult<Vec<TData>, E>. Dispatches to the version selected
by platform_version:
- v0 (
PROTOCOL_VERSION_11and below): always returnsdata: Some(Vec<...>), includingSome(empty_vec)when no input contributed any data. Preserved for chain reproducibility. - v1 (
PROTOCOL_VERSION_12+): returnsdata: Nonewhen no input contributed any data. Seeflattenfor the invariant this restores.
Unlike flatten, merge_many operates on per-item TData (not
Vec<TData>), so each Some(_) input contributes exactly one
element — there is no Some(empty_vec)-input collapse hazard at
this layer.
See issue #2867 for context on the v0 → v1 change.
Source§impl<E: Debug> ValidationResult<(), E>
impl<E: Debug> ValidationResult<(), E>
pub fn merge_many_errors<I: IntoIterator<Item = SimpleValidationResult<E>>>( items: I, ) -> SimpleValidationResult<E>
Source§impl<TData: Clone, E: Debug> ValidationResult<TData, E>
impl<TData: Clone, E: Debug> ValidationResult<TData, E>
pub fn new() -> Self
pub fn new_with_data(data: TData) -> Self
pub fn new_with_data_and_errors(data: TData, errors: Vec<E>) -> Self
pub fn new_with_error(error: E) -> Self
pub fn new_with_errors(errors: Vec<E>) -> Self
pub fn map<F, U: Clone>(self, f: F) -> ValidationResult<U, E>where
F: FnOnce(TData) -> U,
pub fn map_result<F, U: Clone, G>( self, f: F, ) -> Result<ValidationResult<U, E>, G>
pub fn and_then_simple_validation<F>( self, f: F, ) -> Result<ValidationResult<TData, E>, ProtocolError>
pub fn and_then_validation<F, U: Clone, G>( self, f: F, ) -> Result<ValidationResult<U, E>, G>
pub fn and_then_borrowed_validation<F, U: Clone, G>( self, f: F, ) -> Result<ValidationResult<U, E>, G>
pub fn add_error<T>(&mut self, error: T)where
T: Into<E>,
pub fn add_errors(&mut self, errors: Vec<E>)
pub fn add_errors_into<EI: Into<E>>(&mut self, errors: Vec<EI>)
pub fn merge<TOtherData: Clone>( &mut self, other: ValidationResult<TOtherData, E>, )
pub fn is_valid(&self) -> bool
pub fn is_err(&self) -> bool
pub fn first_error(&self) -> Option<&E>
pub fn get_error(&self, pos: usize) -> Option<&E>
pub fn into_result_without_data(self) -> ValidationResult<(), E>
pub fn is_valid_with_data(&self) -> bool
pub fn has_data(&self) -> bool
pub fn set_data(&mut self, data: TData)
pub fn into_data(self) -> Result<TData, ProtocolError>
pub fn into_data_with_error(self) -> Result<Result<TData, E>, ProtocolError>
pub fn into_data_and_errors(self) -> Result<(TData, Vec<E>), ProtocolError>
pub fn data_as_borrowed(&self) -> Result<&TData, ProtocolError>
Trait Implementations§
Source§impl<TData: Clone + Clone, E: Clone + Debug> Clone for ValidationResult<TData, E>
impl<TData: Clone + Clone, E: Clone + Debug> Clone for ValidationResult<TData, E>
Source§fn clone(&self) -> ValidationResult<TData, E>
fn clone(&self) -> ValidationResult<TData, E>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl<TData, E> Freeze for ValidationResult<TData, E>where
TData: Freeze,
impl<TData, E> RefUnwindSafe for ValidationResult<TData, E>where
TData: RefUnwindSafe,
E: RefUnwindSafe,
impl<TData, E> Send for ValidationResult<TData, E>
impl<TData, E> Sync for ValidationResult<TData, E>
impl<TData, E> Unpin for ValidationResult<TData, E>
impl<TData, E> UnsafeUnpin for ValidationResult<TData, E>where
TData: UnsafeUnpin,
impl<TData, E> UnwindSafe for ValidationResult<TData, E>where
TData: UnwindSafe,
E: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T, U> IntoOnNetwork<U> for Twhere
U: FromOnNetwork<T>,
impl<T, U> IntoOnNetwork<U> for Twhere
U: FromOnNetwork<T>,
§fn into_on_network(self, network: Network) -> U
fn into_on_network(self, network: Network) -> U
Calls U::from_on_network(self).
§impl<T, U> IntoPlatformVersioned<U> for Twhere
U: FromPlatformVersioned<T>,
impl<T, U> IntoPlatformVersioned<U> for Twhere
U: FromPlatformVersioned<T>,
§fn into_platform_versioned(self, platform_version: &PlatformVersion) -> U
fn into_platform_versioned(self, platform_version: &PlatformVersion) -> U
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.