Diffstat (limited to 'src/walk/walkers/core/struct.rs')
| -rw-r--r-- | src/walk/walkers/core/struct.rs | 101 |
1 files changed, 48 insertions, 53 deletions
diff --git a/src/walk/walkers/core/struct.rs b/src/walk/walkers/core/struct.rs index 21f48bd..93e8bba 100644 --- a/src/walk/walkers/core/struct.rs +++ b/src/walk/walkers/core/struct.rs @@ -8,10 +8,13 @@ use crate::{ never::Never, protocol::{ visitor::{ - visit_recoverable, visit_request_hint, visit_sequence, visit_tag, visit_value, RecoverableKnown, RecoverableProto, RecoverableScope, SequenceKnown, SequenceProto, SequenceScope, TagConst, TagDyn, TagError, TagHint, TagKnown, TagProto, ValueKnown, ValueProto, VisitResult + visit_recoverable, visit_request_hint, visit_sequence, visit_tag, visit_value, + RecoverableKnown, RecoverableProto, RecoverableScope, SequenceKnown, SequenceProto, + SequenceScope, TagConst, TagDyn, TagError, TagHint, TagKnown, TagProto, ValueKnown, + ValueProto, VisitResult, }, - walker::hint::{HintMeta, HintProto}, walker::hint::{Hint, Known}, + walker::hint::{HintMeta, HintProto}, Visitor, }, Flow, Status, WalkerTypes, TAG_FIELD_NAMES, TAG_MAP, TAG_STRUCT, TAG_TYPE_ID, TAG_TYPE_NAME, @@ -46,10 +49,10 @@ pub trait StructTypeInfo<'ctx, M>: 'static { const FIELDS: &'static [&'static str]; /// The walking errors for the fields. - type FieldError: Send; + type FieldError: Send + Sync; /// The struct being described. - type T: Send; + type T: Send + Sync; /// Walk the given field. fn walk_field<'a, E: Effect>( @@ -110,7 +113,7 @@ impl<'ctx, T, I, E, M> crate::Walker<'ctx, E> for StructWalker<'ctx, T, I, M, E> where E: Effect, I: StructTypeInfo<'ctx, M, T = T>, - T: Sync + 'static, + T: Send + Sync + 'static, { fn walk<'a>( mut self, @@ -145,7 +148,7 @@ any_trait! { HintProto<TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>, E>, ] where E: Effect, - T: Sync + 'static, + T: Send + Sync + 'static, I: StructTypeInfo<'ctx, M, T = T> } @@ -153,12 +156,12 @@ impl<'ctx, T, I, M, E> Hint<'ctx, RecoverableProto<E>, E> for StructWalker<'ctx, where E: Effect, I: StructTypeInfo<'ctx, M, T = T>, - T: Sync + 'static, + T: Send + Sync + 'static, { fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <RecoverableProto<E> as HintMeta<'ctx>>::Hint, + _hint: <RecoverableProto<E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_recoverable::<E>(visitor, self), @@ -171,7 +174,7 @@ where fn known<'a>( &'a mut self, - _hint: &'a <RecoverableProto<E> as HintMeta<'ctx>>::Hint, + _hint: &'a <RecoverableProto<E> as HintMeta>::Hint, ) -> Future<'a, Result<Known<'a, 'ctx, RecoverableProto<E>>, ()>, E> { E::ready(Ok(RecoverableKnown)) } @@ -187,7 +190,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E, _>( @@ -208,9 +211,7 @@ where fn known<'a>( &'a mut self, - _hint: &'a <TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta< - 'ctx, - >>::Hint, + _hint: &'a <TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta>::Hint, ) -> Future< 'a, Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>>, ()>, @@ -232,7 +233,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_TYPE_NAME.to_int() }>, E, _>( @@ -253,12 +254,9 @@ where fn known<'a>( &'a mut self, - _hint: &'a <TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta<'ctx>>::Hint, - ) -> Future< - 'a, - Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E>>, ()>, - E, - > { + _hint: &'a <TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E> as HintMeta>::Hint, + ) -> Future<'a, Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E>>, ()>, E> + { E::ready(Ok(TagKnown { kind_available: Some(true), })) @@ -275,7 +273,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <TagProto<TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <TagProto<TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_MAP.to_int() }>, E, _>(TagConst, visitor, NoopWalker::new()), @@ -292,7 +290,7 @@ where fn known<'a>( &'a mut self, - _hint: &'a <TagProto<TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: &'a <TagProto<TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_MAP.to_int() }>, E>>, ()>, E> { E::ready(Ok(TagKnown { @@ -311,7 +309,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_STRUCT.to_int() }>, E, _>( @@ -332,12 +330,9 @@ where fn known<'a>( &'a mut self, - _hint: &'a <TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta<'ctx>>::Hint, - ) -> Future< - 'a, - Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E>>, ()>, - E, - > { + _hint: &'a <TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E> as HintMeta>::Hint, + ) -> Future<'a, Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E>>, ()>, E> + { E::ready(Ok(TagKnown { kind_available: Some(true), })) @@ -354,7 +349,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, + _hint: <TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map( visit_tag::<TagConst<{ TAG_TYPE_ID.to_int() }>, E, _>( @@ -375,12 +370,9 @@ where fn known<'a>( &'a mut self, - _hint: &'a <TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta<'ctx>>::Hint, - ) -> Future< - 'a, - Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E>>, ()>, - E, - > { + _hint: &'a <TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E> as HintMeta>::Hint, + ) -> Future<'a, Result<Known<'a, 'ctx, TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E>>, ()>, E> + { E::ready(Ok(TagKnown { kind_available: Some(true), })) @@ -396,28 +388,28 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - hint: <TagProto<TagDyn, E> as HintMeta<'ctx>>::Hint, + hint: <TagProto<TagDyn, E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { match hint.kind.0 { - crate::TAG_TYPE_ID => Hint::< - 'ctx, - TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E>, - E, - >::hint(self, visitor, TagHint { kind: TagConst }), - crate::TAG_STRUCT => { - Hint::<'ctx, TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E>, E>::hint( + crate::TAG_TYPE_ID => { + Hint::<'ctx, TagProto<TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E>::hint( self, visitor, TagHint { kind: TagConst }, ) } - crate::TAG_MAP => { - Hint::<'ctx, TagProto<TagConst<{ TAG_MAP.to_int() }>, E>, E>::hint( + crate::TAG_STRUCT => { + Hint::<'ctx, TagProto<TagConst<{ TAG_STRUCT.to_int() }>, E>, E>::hint( self, visitor, TagHint { kind: TagConst }, ) } + crate::TAG_MAP => Hint::<'ctx, TagProto<TagConst<{ TAG_MAP.to_int() }>, E>, E>::hint( + self, + visitor, + TagHint { kind: TagConst }, + ), crate::TAG_TYPE_NAME => Hint::< 'ctx, TagProto<TagConst<{ TAG_TYPE_NAME.to_int() }>, E>, @@ -434,7 +426,7 @@ where fn known<'a>( &'a mut self, - hint: &'a <TagProto<TagDyn, E> as HintMeta<'ctx>>::Hint, + hint: &'a <TagProto<TagDyn, E> as HintMeta>::Hint, ) -> Future<'a, Result<Known<'a, 'ctx, TagProto<TagDyn, E>>, ()>, E> { E::ready(match hint.kind { TagDyn(crate::TAG_TYPE_ID) | TagDyn(crate::TAG_STRUCT) => Ok(TagKnown { @@ -452,7 +444,7 @@ impl<'ctx, T, I, M, E> Hint<'ctx, ValueProto<BorrowedStaticHrt<T>, E>, E> where E: Effect, I: StructTypeInfo<'ctx, M>, - T: Sync + 'static, + T: Send + Sync + 'static, { fn hint<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>, _hint: ()) -> Future<'a, Flow, E> { E::map( @@ -464,8 +456,11 @@ where ) } - fn known<'a>(&'a mut self, _hint: &'a ()) -> Future<'a, Result<ValueKnown, ()>, E> { - E::ready(Ok(ValueKnown)) + fn known<'a>( + &'a mut self, + _hint: &'a (), + ) -> Future<'a, Result<ValueKnown<'a, BorrowedStatic<'ctx, T>>, ()>, E> { + E::ready(Ok(ValueKnown { preview: None })) } } @@ -478,7 +473,7 @@ where fn hint<'a>( &'a mut self, visitor: Visitor<'a, 'ctx>, - _hint: <SequenceProto<E> as HintMeta<'ctx>>::Hint, + _hint: <SequenceProto<E> as HintMeta>::Hint, ) -> Future<'a, Flow, E> { E::map(visit_sequence::<E>(visitor, self), |status| match status { VisitResult::Skipped(_) => Flow::Continue, @@ -488,7 +483,7 @@ where fn known<'a>( &'a mut self, - _hint: &'a <SequenceProto<E> as HintMeta<'ctx>>::Hint, + _hint: &'a <SequenceProto<E> as HintMeta>::Hint, ) -> Future<'a, Result<Known<'a, 'ctx, SequenceProto<E>>, ()>, E> { let len = I::FIELDS.len(); @@ -535,7 +530,7 @@ impl<'ctx, T, I, M, E> RecoverableScope<'ctx, E> for StructWalker<'ctx, T, I, M, where E: Effect, I: StructTypeInfo<'ctx, M, T = T>, - T: Sync + 'static, + T: Send + Sync + 'static, { fn new_walk<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>) -> Future<'a, Status, E> { // Reset the errors to default state. |