rusttypesrust-warp

Into<SocketAddr> for String


I'm trying to give a String to the warp::server().run() function as the listening address. But I do not know how to impl Into<SocketAddr> for String.

Code

use warp::Filter;

#[tokio::main]
async fn main() {
    // GET /hello/warp => 200 OK with body "Hello, warp!"
    let hello = warp::path!("hello" / String)
        .map(|name| format!("Hello, {}!", name));

    warp::serve(hello)
        .run("127.0.0.1:3030")
        .await;
}

Error

error[E0277]: the trait bound `std::net::SocketAddr: From<&str>` is not satisfied
  --> src/server/mod.rs:24:29
   |
24 |         warp::serve(routes).run("127.0.0.1:3030").await;
   |                             ^^^ the trait `From<&str>` is not implemented for `std::net::SocketAddr`
   |
   = help: the following implementations were found:
             <std::net::SocketAddr as From<(I, u16)>>
             <std::net::SocketAddr as From<SocketAddrV4>>
             <std::net::SocketAddr as From<SocketAddrV6>>
   = note: required because of the requirements on the impl of `Into<std::net::SocketAddr>` for `&str`

Solution

  • Conversion from a &str or String into a SocketAddr is fallible, e.g. "" cannot be mapped to a valid SocketAddr.

    Thus you need to use a fallible conversion to obtain a type that implements Into<SocketAddr>, one such type is SocketAddr itself. You can convert a &str to a SocketAddr through FromStr or TryFrom which enable you to write "127.0.0.1:3030".parse::<SocketAddr>().unwrap().

    Another option is changing the way you pass your address data to the run() method, e.g. ([u8;4], u16) should implement direct conversion since the type constrains it to valid SocketAddrs.