Replace pin_project and updated dependencies

This commit is contained in:
johannesd3 2021-01-22 22:32:45 +01:00
parent 0895f17f8a
commit 6c9d8c8d83
6 changed files with 56 additions and 55 deletions

View file

@ -16,11 +16,11 @@ bit-set = "0.5"
byteorder = "1.4" byteorder = "1.4"
bytes = "1.0" bytes = "1.0"
futures = "0.3" futures = "0.3"
lewton = "0.9" lewton = "0.10"
log = "0.4" log = "0.4"
num-bigint = "0.3" num-bigint = "0.3"
num-traits = "0.2" num-traits = "0.2"
pin-project = "1.0" pin-project-lite = "0.2.4"
tempfile = "3.1" tempfile = "3.1"
librespot-tremor = { version = "0.1.0", optional = true } librespot-tremor = { version = "0.1.0", optional = true }

View file

@ -502,8 +502,8 @@ async fn audio_file_fetch_receive_data(
future::ready(if request_length == 0 { future::ready(if request_length == 0 {
Err(TryFoldErr::FinishEarly) Err(TryFoldErr::FinishEarly)
} else { } else {
Ok(()) Ok(())
}) })
}) })
.await; .await;
@ -532,7 +532,7 @@ async fn audio_file_fetch_receive_data(
); );
} }
} }
/* /*
async fn audio_file_fetch( async fn audio_file_fetch(
session: Session, session: Session,
shared: Arc<AudioFileShared>, shared: Arc<AudioFileShared>,
@ -689,20 +689,21 @@ async fn audio_file_fetch(
future::select_all(vec![f1, f2, f3]).await future::select_all(vec![f1, f2, f3]).await
}*/ }*/
#[pin_project] pin_project! {
struct AudioFileFetch { struct AudioFileFetch {
session: Session, session: Session,
shared: Arc<AudioFileShared>, shared: Arc<AudioFileShared>,
output: Option<NamedTempFile>, output: Option<NamedTempFile>,
file_data_tx: mpsc::UnboundedSender<ReceivedData>, file_data_tx: mpsc::UnboundedSender<ReceivedData>,
#[pin] #[pin]
file_data_rx: mpsc::UnboundedReceiver<ReceivedData>, file_data_rx: mpsc::UnboundedReceiver<ReceivedData>,
#[pin] #[pin]
stream_loader_command_rx: mpsc::UnboundedReceiver<StreamLoaderCommand>, stream_loader_command_rx: mpsc::UnboundedReceiver<StreamLoaderCommand>,
complete_tx: Option<oneshot::Sender<NamedTempFile>>, complete_tx: Option<oneshot::Sender<NamedTempFile>>,
network_response_times_ms: Vec<usize>, network_response_times_ms: Vec<usize>,
}
} }
impl AudioFileFetch { impl AudioFileFetch {
@ -853,8 +854,6 @@ impl AudioFileFetch {
} }
} }
fn poll_file_data_rx(&mut self, cx: &mut Context<'_>) -> Poll<()> { fn poll_file_data_rx(&mut self, cx: &mut Context<'_>) -> Poll<()> {
loop { loop {
match Pin::new(&mut self.file_data_rx).poll_next(cx) { match Pin::new(&mut self.file_data_rx).poll_next(cx) {
@ -923,12 +922,10 @@ impl AudioFileFetch {
if full { if full {
self.finish(); self.finish();
return Poll::Ready(()) return Poll::Ready(());
} }
} }
Poll::Pending => { Poll::Pending => return Poll::Pending,
return Poll::Pending
}
} }
} }
} }
@ -936,27 +933,22 @@ impl AudioFileFetch {
fn poll_stream_loader_command_rx(&mut self, cx: &mut Context<'_>) -> Poll<()> { fn poll_stream_loader_command_rx(&mut self, cx: &mut Context<'_>) -> Poll<()> {
loop { loop {
match Pin::new(&mut self.stream_loader_command_rx).poll_next(cx) { match Pin::new(&mut self.stream_loader_command_rx).poll_next(cx) {
Poll::Ready(None) => Poll::Ready(None) => return Poll::Ready(()),
return Poll::Ready(()), Poll::Ready(Some(cmd)) => match cmd {
Poll::Ready(Some(cmd)) => { StreamLoaderCommand::Fetch(request) => {
match cmd { self.download_range(request.start, request.length);
StreamLoaderCommand::Fetch(request) => {
self.download_range(request.start, request.length);
}
StreamLoaderCommand::RandomAccessMode() => {
*(self.shared.download_strategy.lock().unwrap()) =
DownloadStrategy::RandomAccess();
}
StreamLoaderCommand::StreamMode() => {
*(self.shared.download_strategy.lock().unwrap()) =
DownloadStrategy::Streaming();
}
StreamLoaderCommand::Close() => return Poll::Ready(())
} }
} StreamLoaderCommand::RandomAccessMode() => {
Poll::Pending => return Poll::Pending *(self.shared.download_strategy.lock().unwrap()) =
DownloadStrategy::RandomAccess();
}
StreamLoaderCommand::StreamMode() => {
*(self.shared.download_strategy.lock().unwrap()) =
DownloadStrategy::Streaming();
}
StreamLoaderCommand::Close() => return Poll::Ready(()),
},
Poll::Pending => return Poll::Pending,
} }
} }
} }
@ -974,11 +966,11 @@ impl Future for AudioFileFetch {
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> { fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
if let Poll::Ready(()) = self.poll_stream_loader_command_rx(cx) { if let Poll::Ready(()) = self.poll_stream_loader_command_rx(cx) {
return Poll::Ready(()) return Poll::Ready(());
} }
if let Poll::Ready(()) = self.poll_file_data_rx(cx) { if let Poll::Ready(()) = self.poll_file_data_rx(cx) {
return Poll::Ready(()) return Poll::Ready(());
} }
if let DownloadStrategy::Streaming() = self.get_download_strategy() { if let DownloadStrategy::Streaming() = self.get_download_strategy() {

View file

@ -1,7 +1,9 @@
#![allow(clippy::unused_io_amount)]
#[macro_use] #[macro_use]
extern crate log; extern crate log;
#[macro_use] #[macro_use]
extern crate pin_project; extern crate pin_project_lite;
extern crate aes_ctr; extern crate aes_ctr;
extern crate bit_set; extern crate bit_set;

View file

@ -20,14 +20,14 @@ bytes = "1.0"
futures = { version = "0.3", features = ["bilock", "unstable"] } futures = { version = "0.3", features = ["bilock", "unstable"] }
hmac = "0.7" hmac = "0.7"
httparse = "1.3" httparse = "1.3"
hyper = { version = "0.14", features = ["client", "tcp", "http1", "http2", "stream"] } hyper = { version = "0.14", features = ["client", "tcp", "http1", "http2"] }
log = "0.4" log = "0.4"
num-bigint = "0.3" num-bigint = "0.3"
num-integer = "0.1" num-integer = "0.1"
num-traits = "0.2" num-traits = "0.2"
once_cell = "1.5.2" once_cell = "1.5.2"
pbkdf2 = "0.3" pbkdf2 = "0.3"
pin-project = "1.0" pin-project-lite = "0.2.4"
protobuf = "~2.14.0" protobuf = "~2.14.0"
rand = "0.7" rand = "0.7"
serde = "1.0" serde = "1.0"
@ -35,7 +35,7 @@ serde_derive = "1.0"
serde_json = "1.0" serde_json = "1.0"
sha-1 = "~0.8" sha-1 = "~0.8"
shannon = "0.2.0" shannon = "0.2.0"
tokio = { version = "1.0", features = ["io-util", "rt-multi-thread", "macros" ] } tokio = { version = "1.0", features = ["io-util", "rt-multi-thread"] }
tokio-util = { version = "0.6", features = ["codec"] } tokio-util = { version = "0.6", features = ["codec"] }
url = "1.7" url = "1.7"
uuid = { version = "0.8", features = ["v4"] } uuid = { version = "0.8", features = ["v4"] }
@ -43,3 +43,6 @@ uuid = { version = "0.8", features = ["v4"] }
[build-dependencies] [build-dependencies]
rand = "0.7" rand = "0.7"
vergen = "3.0.4" vergen = "3.0.4"
[dev-dependencies]
tokio = {version = "1.0", features = ["macros"] }

View file

@ -5,7 +5,7 @@ extern crate log;
#[macro_use] #[macro_use]
extern crate serde_derive; extern crate serde_derive;
#[macro_use] #[macro_use]
extern crate pin_project; extern crate pin_project_lite;
extern crate aes; extern crate aes;
extern crate base64; extern crate base64;
extern crate byteorder; extern crate byteorder;
@ -25,7 +25,7 @@ extern crate serde;
extern crate serde_json; extern crate serde_json;
extern crate sha1; extern crate sha1;
extern crate shannon; extern crate shannon;
extern crate tokio; pub extern crate tokio;
extern crate tokio_util; extern crate tokio_util;
extern crate url; extern crate url;
extern crate uuid; extern crate uuid;

View file

@ -31,14 +31,18 @@ pub struct MercuryPending {
callback: Option<oneshot::Sender<Result<MercuryResponse, MercuryError>>>, callback: Option<oneshot::Sender<Result<MercuryResponse, MercuryError>>>,
} }
#[pin_project] pin_project! {
pub struct MercuryFuture<T>(#[pin] oneshot::Receiver<Result<T, MercuryError>>); pub struct MercuryFuture<T> {
#[pin]
receiver: oneshot::Receiver<Result<T, MercuryError>>
}
}
impl<T> Future for MercuryFuture<T> { impl<T> Future for MercuryFuture<T> {
type Output = Result<T, MercuryError>; type Output = Result<T, MercuryError>;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
match self.project().0.poll(cx) { match self.project().receiver.poll(cx) {
Poll::Ready(Ok(x)) => Poll::Ready(x), Poll::Ready(Ok(x)) => Poll::Ready(x),
Poll::Ready(Err(_)) => Poll::Ready(Err(MercuryError)), Poll::Ready(Err(_)) => Poll::Ready(Err(MercuryError)),
Poll::Pending => Poll::Pending, Poll::Pending => Poll::Pending,
@ -73,7 +77,7 @@ impl MercuryManager {
let data = req.encode(&seq); let data = req.encode(&seq);
self.session().send_packet(cmd, data); self.session().send_packet(cmd, data);
MercuryFuture(rx) MercuryFuture { receiver: rx }
} }
pub fn get<T: Into<String>>(&self, uri: T) -> MercuryFuture<MercuryResponse> { pub fn get<T: Into<String>>(&self, uri: T) -> MercuryFuture<MercuryResponse> {