Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am creating a sample Rust project in my Windows system to download a file by HTTP GET request in async mode.

My code is as follows (same as the code mentioned in the Rust Cookbook):

extern crate error_chain;
extern crate tempfile;
extern crate tokio;
extern crate reqwest;
use error_chain::error_chain;
use std::io::copy;
use std::fs::File;
use tempfile::Builder;
error_chain! {
     foreign_links {
         Io(std::io::Error);
         HttpRequest(reqwest::Error);
#[tokio::main]
async fn main() -> Result<()> {
    let tmp_dir = Builder::new().prefix("example").tempdir()?;
    let target = "https://www.rust-lang.org/logos/rust-logo-512x512.png";
    let response = reqwest::get(target).await?;
    let mut dest = {
        let fname = response
            .url()
            .path_segments()
            .and_then(|segments| segments.last())
            .and_then(|name| if name.is_empty() { None } else { Some(name) })
            .unwrap_or("tmp.bin");
        println!("file to download: '{}'", fname);
        let fname = tmp_dir.path().join(fname);
        println!("will be located under: '{:?}'", fname);
        File::create(fname)?
    let content =  response.text().await?;
    copy(&mut content.as_bytes(), &mut dest)?;
    Ok(())

My Cargo.toml file is:

[package]
name = "abcdef"
version = "0.1.0"
authors = ["xyz"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
error-chain = "0.12.4"
tempfile = "3.1.0"
tokio = "0.2.22"
reqwest = "0.10.8"

When I execute cargo run, the following errors are displayed:

error[E0433]: failed to resolve: could not find `main` in `tokio`
  --> src\main.rs:18:10
18 | #[tokio::main]
   |          ^^^^ could not find `main` in `tokio`
error[E0277]: `main` has invalid return type `impl std::future::Future`
  --> src\main.rs:19:20
19 | async fn main() -> Result<()> {
   |                    ^^^^^^^^^^ `main` can only return types that implement `
std::process::Termination`
   = help: consider using `()`, or a `Result`
error[E0752]: `main` function is not allowed to be `async`
  --> src\main.rs:19:1
19 | async fn main() -> Result<()> {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `main` function is not allowed to be `async`

I cross-checked from the Cargo.toml file & edition = "2018" was already there. I am unable to figure out the other errors.

You need to enable an extra feature in tokio to be able to use tokio::main.

Try adding the full feature to the tokio dependency in your Cargo.toml file:

[dependencies]
tokio = { version = "0.2.22", features = ["full"] }

This also applies to later versions of Tokio.

As stated in the documentation for tokio::main:

Available on crate features rt and macros only.

You need to add those features to get access to tokio::main:

[dependencies]
tokio = { version = "1", features = ["rt", "macros"] }

This will only allow access to the single-threaded executor, however, so you'd have to use #[tokio::main(flavor = "current_thread")]. If you want to use #[tokio::main] (which is the same as #[tokio::main(flavor = "multi_thread")], then you need to enable the multi-threaded executor:

Available on crate feature rt-multi-thread only.

[dependencies]
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }

See also:

  • What is the smallest feature set to enable polling a future with Tokio?
  • How do you enable a Rust "crate feature"?
  • This is the better answer. Enabling the "full" feature spits errors in my macOS 12.3.X, something about not detecting libc. Your suggestion however worked. – dimitarvp May 16, 2022 at 20:57

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.