Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Type annotations #33

Open
dbrgn opened this issue Aug 6, 2020 · 4 comments
Open

Type annotations #33

dbrgn opened this issue Aug 6, 2020 · 4 comments

Comments

@dbrgn
Copy link

dbrgn commented Aug 6, 2020

Often I get compile errors when the compiler cannot deduce the type when using try_stream!:

error[E0698]: type inside `async fn` body must be known in this context
   --> src/server.rs:213:18
    |
213 |       let stream = try_stream! {
    |  __________________^
214 | |         while let Some(chunk) = body.data().await {
215 | |             let chunk = chunk?;
216 | |             trace!("Body: {:?}", &chunk);
...   |
219 | |         }
220 | |     };
    | |_____^ cannot infer type for type parameter `E` declared on the enum `Result`

This can be resolved by moving the code into a function that returns the appropriate generic type. However, is it also possible to put a type annotation somewhere? (impl T doesn't seem to work for annotating the type of a local variable.)

@carllerche
Copy link
Member

I don't see you yielding anywhere in this example.

@carllerche
Copy link
Member

Unfortunately, "terrible compilation errors" is going to be a limitation of this crate & the macro strategy. Doing better on the compilation error front will require rustc to provide stream generators.

Sorry :(

@carllerche carllerche reopened this Aug 6, 2020
@dbrgn
Copy link
Author

dbrgn commented Aug 6, 2020

Sorry, the yield was in the part that was omitted in the error message 🙂

Sure, that's fine, I just wondered whether there's an easy way to annotate the return type, so that I won't have to create a helper function. But helper functions work just fine.

@rodrigorc
Copy link

I managed to annotate the return type by writing this:

let stream = try_stream! {
    //...
};
let _: &dyn Stream<Item=Result<_, MyError>> = &stream;

Not the prettiest code, but it gets the job done and looks better than the auxiliary function.
I've checked the generated assembly and it has zero cost.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants