use std::io;
pub enum ResponseLazyReader {
Request(minreq::Request),
Response(minreq::ResponseLazy),
Complete(Result<(), String>),
}
impl From<minreq::Request> for ResponseLazyReader {
fn from(request: minreq::Request) -> ResponseLazyReader {
ResponseLazyReader::Request(request)
}
}
impl From<minreq::ResponseLazy> for ResponseLazyReader {
fn from(response: minreq::ResponseLazy) -> ResponseLazyReader {
ResponseLazyReader::Response(response)
}
}
impl io::Read for ResponseLazyReader {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
use ResponseLazyReader::{Complete, Request, Response};
if buf.is_empty() {
return Ok(0);
}
loop {
match self {
Request(request) => match request.clone().send_lazy() {
Ok(response) => *self = Response(response),
Err(error) => {
let error = Err(format!("download request failed: {error:?}"));
*self = Complete(error);
}
},
Response(response) => {
for (i, buf_byte) in buf.iter_mut().enumerate() {
match response.next() {
Some(Ok((byte, _length))) => {
*buf_byte = byte;
}
None => {
*self = Complete(Ok(()));
return Ok(i);
}
Some(Err(error)) => {
let error = format!("download response failed: {error:?}");
*self = Complete(Err(error.clone()));
return Err(io::Error::other(error));
}
}
}
return Ok(buf.len());
}
Complete(result) => {
return match result {
Ok(()) => Ok(0),
Err(error) => Err(io::Error::other(error.clone())),
};
}
}
}
}
}