Как сохранить hyper::server::Server с обработчиком по умолчанию в качестве поля struct в конструкторе?
Я пытаюсь сохранить hyper::server::Server
как член моей структуры (struct MyApp
ниже). Я могу сделать это, например, из моей программы main()
функция.
Как я могу сделать это в моей структуре MyApp::new()
метод? Я думаю, что мне нужен конкретный тип для F
в MyApp<F>
, Однако, несмотря на попытки, я не могу (правильно) указать конкретный тип для этого замыкания.
Я не могу понять, как это сделать. я думал Box
Закрытие будет работать, позволяя мне передать закрытие как конкретный тип, и действительно, когда я делаю это в main()
, но нет MyApp::new()
, Я надеюсь, что есть способ сделать это в стабильной ржавчине, поскольку я действительно хотел бы реализовать структуру, которая содержит гипер-сервер.
Вот моя структура:
struct MyApp<F> {
hyper_server: Server<MyBoxedClosure<F>, hyper::Body>,
}
И вот полный код, который работает - он устанавливает MyApp.hyper_server
поле в main()
:
extern crate hyper;
extern crate futures;
use hyper::Error;
use hyper::server::{Http, Server, NewService, Service, Request, Response};
use hyper::header::ContentLength;
pub struct HelloWorld;
const PHRASE: &'static str = "Hello, World!";
impl Service for HelloWorld {
type Request = Request;
type Response = Response;
type Error = hyper::Error;
type Future = futures::future::FutureResult<Self::Response, Self::Error>;
fn call(&self, _req: Request) -> Self::Future {
futures::future::ok(
Response::new()
.with_header(ContentLength(PHRASE.len() as u64))
.with_body(PHRASE),
)
}
}
pub struct MyBoxedClosure<F> {
value: Box<F>,
}
impl<F> NewService for MyBoxedClosure<F>
where
F: Fn() -> std::result::Result<HelloWorld, std::io::Error>,
{
type Request = Request;
type Response = Response;
type Error = Error;
type Instance = HelloWorld;
fn new_service(&self) -> std::result::Result<Self::Instance, std::io::Error> {
self.value.new_service()
}
}
struct MyApp<F> {
hyper_server: Server<MyBoxedClosure<F>, hyper::Body>,
}
fn main() {
let mbc = MyBoxedClosure { value: Box::new(|| Ok(HelloWorld)) };
let addr = "127.0.0.1:3000".parse().unwrap();
let hyper_server = Http::new().bind(&addr, mbc).unwrap();
let my_app = MyApp { hyper_server: hyper_server };
println!("Hello, world!");
}
Если я создам MyApp::new()
функция и вызвать это из main()
вместо этого я не могу понять, как избежать ошибки компилятора.
impl<F> MyApp<F>
where
F: Fn() -> std::result::Result<HelloWorld, std::io::Error> + Send + Sync,
{
fn new() -> MyApp<F> {
let mbc = MyBoxedClosure { value: Box::new(|| Ok(HelloWorld)) };
let addr = "127.0.0.1:3000".parse().unwrap();
let hyper_server = Http::new().bind(&addr, mbc).unwrap();
MyApp { hyper_server: hyper_server }
}
}
fn main() {
let _my_app = MyApp::new();
println!("Hello, world!");
}
Ошибка компилятора заключается в следующем:
error[E0308]: mismatched types
--> src/main.rs:56:9
|
56 | MyApp { hyper_server: hyper_server }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found closure
|
= note: expected type `MyApp<F>`
found type `MyApp<[closure@src/main.rs:53:52: 53:69]>`