79 lines
2.1 KiB
Rust
79 lines
2.1 KiB
Rust
use axum::{error_handling::HandleErrorLayer, routing::get, Router};
|
|
use clap::{Arg};
|
|
use std::{net::SocketAddr, time::Duration, error::Error, collections::VecDeque, sync::Arc};
|
|
use tower::ServiceBuilder;
|
|
use http::status::StatusCode;
|
|
|
|
|
|
use dashmap::DashMap;
|
|
|
|
#[derive(Debug)]
|
|
struct DumbQueue<'a> {
|
|
queue_map : DashMap<&'a str, usize>,
|
|
queues : Vec<VecDeque<&'a str>>,
|
|
current_queue : usize,
|
|
}
|
|
|
|
impl <'a> DumbQueue<'a> {
|
|
fn new() -> Self {
|
|
return DumbQueue {
|
|
queue_map: DashMap::new(),
|
|
queues: vec!(),
|
|
current_queue: 0,
|
|
}
|
|
}
|
|
|
|
fn push_back(&mut self, key: &'a str, val: &'a str) {
|
|
let val_key = key;
|
|
let value = val;
|
|
let queue_map = &self.queue_map;
|
|
|
|
let queue_index = queue_map.get(val_key);
|
|
match queue_index {
|
|
Some(i) => {
|
|
let index : usize = *i;
|
|
self.queues[index].push_back(value)
|
|
}
|
|
None => {
|
|
let new_queue = VecDeque::new();
|
|
self.queues.push(new_queue);
|
|
queue_map.insert(val_key, self.current_queue as usize);
|
|
self.queues[self.current_queue].push_back(value);
|
|
self.current_queue += 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
fn pop_front(&mut self, key: &'a str) -> Option<&str> {
|
|
let val_key = key;
|
|
let queue_map = &self.queue_map;
|
|
let queue_index = queue_map.get(val_key);
|
|
match queue_index {
|
|
Some(i) => {
|
|
let index : usize = *i;
|
|
return Some(self.queues[index].pop_front().unwrap())
|
|
}
|
|
None => None
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let mut queue = DumbQueue::new();
|
|
|
|
println!("Push value...");
|
|
let _ = queue.push_back(&"/what", "the fuck?");
|
|
let _ = queue.push_back(&"/foo", "bar...");
|
|
|
|
println!("Queue manager thing: {:?}", queue);
|
|
|
|
println!("Pop value...");
|
|
let popped = queue.pop_front("/what");
|
|
println!("{:?}", popped);
|
|
|
|
let _ = queue.push_back(&"/foo", "baz...");
|
|
|
|
|
|
println!("{:?}", queue);
|
|
}
|