Diffstat (limited to 'src/walk/walkers/core/struct.rs')
-rw-r--r--src/walk/walkers/core/struct.rs101
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.