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`
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 SocketAddr
s.