Как отправить файл, включенный в include_bytes! как железный ответ?

Я пытаюсь отправить файл, который я включил в двоичный файл с include_bytes! в приложении Iron. Я хочу получить один файл для своего приложения, и для этого потребуется очень мало файлов HTML, CSS и JS. Вот небольшая тестовая установка, с которой я возился:

extern crate iron;

use iron::prelude::*;
use iron::status;
use iron::mime::Mime;

fn main() {
    let index_html = include_bytes!("static/index.html");

    println!("Hello, world!");
    Iron::new(| _: &mut Request| {
        let content_type = "text/html".parse::<Mime>().unwrap();
        Ok(Response::with((content_type, status::Ok, index_html)))
    }).http("localhost:8001").unwrap();
}

Конечно, это не работает, поскольку index_html относится к типу &[u8; 78]

src/main.rs:16:12: 16:26 error: the trait `modifier::Modifier<iron::response::Response>` is not implemented for the type `&[u8; 78]` [E0277]
src/main.rs:16         Ok(Response::with((content_type, status::Ok, index_html)))

Поскольку я новичок в Rust and Iron, я не знаю, как к этому подойти. Я попытался выучить кое-что из документации Iron, но я думаю, что моих знаний по Rust недостаточно, чтобы по-настоящему понять их, особенно то, что эта черта modifier::Modifier должна быть.

Как я могу этого добиться? Могу ли я скрыть тип своего статического ресурса во что-то, что Iron примет, или мне нужно как-то реализовать эту черту Modifier?


person selfawaresoup    schedule 24.01.2016    source источник


Ответы (1)


Компилятор предлагает альтернативу impl:

src/main.rs:13:12: 13:26 help: the following implementations were found:
src/main.rs:13:12: 13:26 help:   <&'a [u8] as modifier::Modifier<iron::response::Response>>

Чтобы гарантировать, что срез живет достаточно долго, проще заменить переменную index_html глобальной константой, а поскольку мы должны указать тип констант, давайте укажем его как &'static [u8].

extern crate iron;

use iron::prelude::*;
use iron::status;
use iron::mime::Mime;

const INDEX_HTML: &'static [u8] = include_bytes!("static/index.html");

fn main() {
    println!("Hello, world!");
    Iron::new(| _: &mut Request| {
        let content_type = "text/html".parse::<Mime>().unwrap();
        Ok(Response::with((content_type, status::Ok, INDEX_HTML)))
    }).http("localhost:8001").unwrap();
}

Кстати, я пытался найти реализации для Modifier в документации, но, к сожалению, думаю, что их нет в списке. Однако я нашел некоторые реализации для Modifier<Response> в источнике для модуля iron::modifiers.

person Francis Gagné    schedule 24.01.2016
comment
Прохладный. Как вы заставили компилятор напечатать это предложение? - person selfawaresoup; 24.01.2016
comment
Я использую rustc 1.8.0-nightly (d63b8e539 2016-01-23). Может это новая функция. - person Francis Gagné; 24.01.2016