From acf34c27225cbe9eee11bce3e2c986b32ac131b7 Mon Sep 17 00:00:00 2001 From: chmanie Date: Tue, 23 May 2023 14:42:53 +0200 Subject: [PATCH] Add placeholders for request and stream testing --- Cargo.lock | 1 + cbd-tui/Cargo.toml | 1 + cbd-tui/src/main.rs | 89 ++++++++++++++++++++------------------ crabidy-server/src/main.rs | 24 +++++++--- 4 files changed, 69 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65e8699..334c648 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -133,6 +133,7 @@ dependencies = [ "flume", "ratatui", "tokio", + "tokio-stream", "tonic", ] diff --git a/cbd-tui/Cargo.toml b/cbd-tui/Cargo.toml index eb2bc66..a262084 100644 --- a/cbd-tui/Cargo.toml +++ b/cbd-tui/Cargo.toml @@ -11,4 +11,5 @@ crabidy-core = { path = "../crabidy-core" } flume = "0.10.14" ratatui = "0.20.1" tokio = { version = "1", features = ["full"] } +tokio-stream = "0.1" tonic = "0.9" diff --git a/cbd-tui/src/main.rs b/cbd-tui/src/main.rs index 76e8108..8b5d298 100644 --- a/cbd-tui/src/main.rs +++ b/cbd-tui/src/main.rs @@ -1,5 +1,6 @@ use crabidy_core::proto::crabidy::{ - crabidy_service_client::CrabidyServiceClient, GetLibraryNodeRequest, + crabidy_service_client::CrabidyServiceClient, get_queue_updates_response::QueueUpdateResult, + GetLibraryNodeRequest, GetQueueUpdatesRequest, LibraryNode, LibraryNodeState, }; use crossterm::{ @@ -22,9 +23,9 @@ use std::{ time::{Duration, Instant}, vec, }; -use tonic::Request; - use tokio::task; +use tokio_stream::StreamExt; +use tonic::Request; struct StatefulList { state: ListState, @@ -84,45 +85,16 @@ impl StatefulList { } } -struct ListNode { - name: String, - children: Option>, -} - struct App { - library: StatefulList, - queue: StatefulList, + library: StatefulList, + queue: StatefulList, } impl App { fn new() -> App { let mut library = StatefulList::default(); - library.items.push(ListNode { - name: "Tidal".to_owned(), - children: None, - }); - library.items.push(ListNode { - name: "YouTube".to_owned(), - children: None, - }); library.focus(); let mut queue = StatefulList::default(); - queue.items.push(ListNode { - name: "GLaDOS - Still Alive".to_owned(), - children: None, - }); - queue.items.push(ListNode { - name: "Floppotron - Star Wars Theme".to_owned(), - children: None, - }); - queue.items.push(ListNode { - name: "Starcop - Starcop".to_owned(), - children: None, - }); - queue.items.push(ListNode { - name: "Efence - Airglow".to_owned(), - children: None, - }); App { library, queue } } @@ -140,6 +112,7 @@ impl App { enum Message { Quit, LibraryData(String), + QueueData(String), } #[tokio::main] @@ -153,11 +126,11 @@ async fn main() -> Result<(), Box> { let mut client = CrabidyServiceClient::connect("http://[::1]:50051").await?; - let request = Request::new(GetLibraryNodeRequest { + let get_library_node_request = Request::new(GetLibraryNodeRequest { uuid: "/".to_string(), }); - let response = client.get_library_node(request).await?; + let response = client.get_library_node(get_library_node_request).await?; if let Some(node) = response.into_inner().node { node.children.iter().for_each(|c| { @@ -165,7 +138,20 @@ async fn main() -> Result<(), Box> { }) } + let get_queue_updates_request = Request::new(GetQueueUpdatesRequest { timestamp: 0 }); + + let mut queue_update_stream = client + .get_queue_updates(get_queue_updates_request) + .await? + .into_inner(); + loop { + while let Some(Ok(resp)) = queue_update_stream.next().await { + if let Some(QueueUpdateResult::PositionChange(pos)) = resp.queue_update_result { + tx.send(Message::QueueData(pos.timestamp.to_string())); + } + } + match rx.recv() { Ok(Message::Quit) => { break; @@ -192,11 +178,32 @@ fn run_ui(tx: Sender, rx: Receiver) { loop { for message in rx.try_iter() { - if let Message::LibraryData(title) = message { - app.library.items.push(ListNode { - name: title, - children: None, - }); + match message { + Message::LibraryData(title) => { + // FIXME: this is obviously bullshit + app.library.items.push(LibraryNode { + uuid: title.clone(), + name: title.clone(), + children: Vec::new(), + is_queable: false, + parent: None, + state: LibraryNodeState::Done.into(), + tracks: Vec::new(), + }); + } + Message::QueueData(random_no) => { + // FIXME: this is obviously bullshit + app.queue.items.push(LibraryNode { + uuid: random_no.clone(), + name: random_no.clone(), + children: Vec::new(), + is_queable: false, + parent: None, + state: LibraryNodeState::Done.into(), + tracks: Vec::new(), + }); + } + _ => {} } } diff --git a/crabidy-server/src/main.rs b/crabidy-server/src/main.rs index de275e6..a58c021 100644 --- a/crabidy-server/src/main.rs +++ b/crabidy-server/src/main.rs @@ -1,14 +1,15 @@ -use anyhow::{Error, Result}; +use anyhow::Error; use async_trait::async_trait; use crabidy_core::proto::crabidy::{ crabidy_service_server::{CrabidyService, CrabidyServiceServer}, + get_queue_updates_response::QueueUpdateResult, AppendNodeRequest, AppendNodeResponse, AppendTrackRequest, AppendTrackResponse, GetActiveTrackRequest, GetActiveTrackResponse, GetLibraryNodeRequest, GetLibraryNodeResponse, GetQueueRequest, GetQueueResponse, GetQueueUpdatesRequest, GetQueueUpdatesResponse, GetTrackRequest, GetTrackResponse, GetTrackUpdatesRequest, GetTrackUpdatesResponse, LibraryNode, LibraryNodeState, Queue, QueueLibraryNodeRequest, QueueLibraryNodeResponse, - QueueTrackRequest, QueueTrackResponse, RemoveTracksRequest, RemoveTracksResponse, - ReplaceWithNodeRequest, ReplaceWithNodeResponse, ReplaceWithTrackRequest, + QueuePositionChange, QueueTrackRequest, QueueTrackResponse, RemoveTracksRequest, + RemoveTracksResponse, ReplaceWithNodeRequest, ReplaceWithNodeResponse, ReplaceWithTrackRequest, ReplaceWithTrackResponse, SaveQueueRequest, SaveQueueResponse, SetCurrentTrackRequest, SetCurrentTrackResponse, StopRequest, StopResponse, TogglePlayRequest, TogglePlayResponse, TrackPlayState, @@ -17,7 +18,7 @@ use crabidy_core::{ProviderClient, ProviderError}; use gstreamer_play::{Play, PlayMessage, PlayState, PlayVideoRenderer}; // use once_cell::sync::OnceCell; use std::{collections::HashMap, fs, pin::Pin, sync::RwLock}; -use tonic::{codegen::futures_core::Stream, transport::Server, Request, Response, Status}; +use tonic::{codegen::futures_core::Stream, transport::Server, Request, Response, Result, Status}; // static CHANNEL: OnceCell> = OnceCell::new(); // static ORCHESTRATOR_CHANNEL: OnceCell> = OnceCell::new(); @@ -224,7 +225,20 @@ impl CrabidyService for AppState { &self, request: tonic::Request, ) -> std::result::Result, tonic::Status> { - let queue_vec: Vec> = vec![]; + let queue_vec: Vec> = vec![ + Ok(GetQueueUpdatesResponse { + queue_update_result: Some(QueueUpdateResult::PositionChange(QueuePositionChange { + timestamp: 12345, + new_position: 42, + })), + }), + Ok(GetQueueUpdatesResponse { + queue_update_result: Some(QueueUpdateResult::PositionChange(QueuePositionChange { + timestamp: 6666, + new_position: 11, + })), + }), + ]; let output_stream = futures::stream::iter(queue_vec.into_iter()); Ok(Response::new(output_stream)) }