Я изучаю Iron web framework for Rust и создал небольшой обработчик, который будет считывать изображение, полученное из URL-адреса запроса, изменять его размер и затем доставлять результат. Из того, что я могу сказать, Iron Response может быть построен из нескольких различных типов, включая типы, которые реализуют Read trait.Функция подключения, которая берет запись в функцию, которая принимает Чтение
save function в image crate принимает тип, который реализует Write trait.
Похоже, что эти две функции должны быть подключены таким образом, чтобы писатель записывал буфер, из которого читатель читает. Я нашел pipe crate, который, похоже, реализует это поведение, но у меня возникли проблемы с тем, что конец трубы Read
вошел в то, что примет Iron.
Несколько упрощенная версия моей функции:
fn artwork(req: &mut Request) -> IronResult<Response> {
let mut filepath = PathBuf::from("artwork/sample.png");
let img = match image::open(&filepath) {
Ok(img) => img,
Err(e) => return Err(IronError::new(e, status::InternalServerError))
};
let (mut read, mut write) = pipe::pipe();
thread::spawn(move || {
let thumb = img.resize(128, 128, image::FilterType::Triangle);
thumb.save(&mut write, image::JPEG).unwrap();
});
let mut res = Response::new();
res.status = Some(iron::status::Ok);
res.body = Some(Box::new(read));
Ok(res)
}
Ошибка я получаю:
src/main.rs:70:21: 70:35 error: the trait `iron::response::WriteBody` is not implemented for the type `pipe::PipeReader` [E0277]
src/main.rs:70 res.body = Some(Box::new(read));
^~~~~~~~~~~~~~
PipeReader реализует Read
и WriteBody реализуется для Read
, поэтому я считаю, что это должно работать. Я также попытался:
let reader: Box<Read> = Box::new(read);
let mut res = Response::new();
res.status = Some(iron::status::Ok);
res.body = Some(reader);
, но это дает ошибку:
src/main.rs:72:21: 72:27 error: mismatched types:
expected `Box<iron::response::WriteBody + Send>`,
found `Box<std::io::Read>`
(expected trait `iron::response::WriteBody`,
found trait `std::io::Read`) [E0308]
src/main.rs:72 res.body = Some(reader);
^~~~~~
Как я могу подключить к save
функцию тела ответа Железного?
Я получаю: «черта' iron :: response :: WriteBody' не реализована для типа 'Box' [E0277] "в поле« Box :: new »(Box :: new (читать))".[Я попытался извлечь внутренний ящик] (https://gist.github.com/wezm/a45b751a62c44a878623), но затем жалуется, что «Send» не реализован для типа «std :: io :: Read'». –
Wes
См. Мой переписанный ответ. –