#![allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum StreamState {
Idle,
Loading,
Ready,
Error,
}
#[derive(Debug, Clone)]
pub struct StreamEntry {
pub name: String,
pub priority: u8,
pub state: StreamState,
}
#[derive(Debug, Clone)]
pub struct StreamingMorph {
pub queue: Vec<StreamEntry>,
pub max_concurrent: usize,
pub enabled: bool,
}
impl StreamingMorph {
pub fn new(max_concurrent: usize) -> Self {
StreamingMorph {
queue: Vec::new(),
max_concurrent,
enabled: true,
}
}
}
pub fn new_streaming_morph(max_concurrent: usize) -> StreamingMorph {
StreamingMorph::new(max_concurrent)
}
pub fn sm_enqueue(loader: &mut StreamingMorph, name: impl Into<String>, priority: u8) {
loader.queue.push(StreamEntry {
name: name.into(),
priority,
state: StreamState::Idle,
});
}
pub fn sm_tick(loader: &mut StreamingMorph) {
let mut loading_count = loader
.queue
.iter()
.filter(|e| e.state == StreamState::Loading)
.count();
for entry in &mut loader.queue {
if loading_count >= loader.max_concurrent {
break;
}
if entry.state == StreamState::Idle {
entry.state = StreamState::Loading;
loading_count += 1;
}
}
}
pub fn sm_queue_len(loader: &StreamingMorph) -> usize {
loader.queue.len()
}
pub fn sm_set_enabled(loader: &mut StreamingMorph, enabled: bool) {
loader.enabled = enabled;
}
pub fn sm_to_json(loader: &StreamingMorph) -> String {
format!(
r#"{{"queue_len":{},"max_concurrent":{},"enabled":{}}}"#,
loader.queue.len(),
loader.max_concurrent,
loader.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_empty_queue() {
let l = new_streaming_morph(4);
assert_eq!(sm_queue_len(&l), 0 ,);
}
#[test]
fn test_enqueue() {
let mut l = new_streaming_morph(4);
sm_enqueue(&mut l, "brow_raise", 10);
assert_eq!(sm_queue_len(&l), 1 ,);
}
#[test]
fn test_tick_sets_loading() {
let mut l = new_streaming_morph(2);
sm_enqueue(&mut l, "a", 1);
sm_enqueue(&mut l, "b", 2);
sm_enqueue(&mut l, "c", 3);
sm_tick(&mut l);
let loading = l
.queue
.iter()
.filter(|e| e.state == StreamState::Loading)
.count();
assert_eq!(
loading,
2,
);
}
#[test]
fn test_tick_respects_max() {
let mut l = new_streaming_morph(1);
sm_enqueue(&mut l, "x", 5);
sm_enqueue(&mut l, "y", 3);
sm_tick(&mut l);
let loading = l
.queue
.iter()
.filter(|e| e.state == StreamState::Loading)
.count();
assert_eq!(loading, 1 ,);
}
#[test]
fn test_initial_state_idle() {
let mut l = new_streaming_morph(2);
sm_enqueue(&mut l, "z", 0);
assert_eq!(
l.queue[0].state,
StreamState::Idle,
);
}
#[test]
fn test_set_enabled() {
let mut l = new_streaming_morph(2);
sm_set_enabled(&mut l, false);
assert!(!l.enabled ,);
}
#[test]
fn test_to_json_contains_queue_len() {
let l = new_streaming_morph(4);
let j = sm_to_json(&l);
assert!(j.contains("\"queue_len\""), );
}
#[test]
fn test_priority_stored() {
let mut l = new_streaming_morph(4);
sm_enqueue(&mut l, "hi", 255);
assert_eq!(l.queue[0].priority, 255 ,);
}
#[test]
fn test_max_concurrent_stored() {
let l = new_streaming_morph(8);
assert_eq!(l.max_concurrent, 8 ,);
}
#[test]
fn test_enabled_default() {
let l = new_streaming_morph(2);
assert!(l.enabled ,);
}
}