Skip to content

Instantly share code, notes, and snippets.

View matthewjberger's full-sized avatar
🦀
Writing something in Rust, probably

Matthew J. Berger matthewjberger

🦀
Writing something in Rust, probably
View GitHub Profile
@matthewjberger
matthewjberger / broker.rs
Last active November 11, 2024 22:02
mini rust message broker
use std::collections::{HashMap, VecDeque};
#[derive(Debug, Clone, PartialEq)]
pub enum Message {
Text(String),
Number(i64),
Binary(Vec<u8>),
Batch(Vec<Message>),
}
@matthewjberger
matthewjberger / ecs.rs
Last active November 12, 2024 06:07
an archetypal statically dispatched macro-based ecs - formal library here: https://github.com/matthewjberger/freecs
#[macro_export]
macro_rules! world {
(
$world:ident {
components {
$($name:ident: $type:ty => $mask:ident),* $(,)?
}$(,)?
$resources:ident {
$($resource_name:ident: $resource_type:ty),* $(,)?
}
@matthewjberger
matthewjberger / fast.rs
Last active November 6, 2024 19:48
Vec<Option<T>> comparison to precomputing entity archetypes
impl_world! {
positions: Position => POSITION = 0,
velocities: Velocity => VELOCITY = 1,
gravities: Gravity => GRAVITY = 2,
healths: Health => HEALTH = 3,
damages: Damage => DAMAGE = 4,
}
pub fn main() {
let mut world = World::default();
@matthewjberger
matthewjberger / ringbuffer.rs
Created October 1, 2024 16:45
A no-std fixed capacity ringbuffer in rust
#![no_std]
pub struct CircularBuffer<T, const N: usize> {
buffer: [T; N],
read_idx: usize,
write_idx: usize,
is_full: bool,
}
impl<T: Copy + Default, const N: usize> CircularBuffer<T, N> {
@matthewjberger
matthewjberger / main.rs
Created September 29, 2024 15:11
more ecs ideas in rust
use std::any::Any;
use std::collections::HashMap;
use std::marker::PhantomData;
// Generic handle type
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Handle<T> {
id: usize,
_phantom: PhantomData<T>,
}
@matthewjberger
matthewjberger / main.rs
Last active September 26, 2024 19:31
Use regex to extract parts of sections of MQTT-like topic strings
use regex::Regex;
use std::collections::HashMap;
#[derive(Debug)]
struct CaptureSpec {
name: String,
position: usize,
regex: Option<String>,
}
use serde_json::Value;
use std::collections::HashMap;
pub fn expand_json_template(template: &str, tokens: &HashMap<String, String>) -> Option<String> {
let substituted = substitute_tokens(template, tokens);
match serde_json::from_str::<Value>(&substituted) {
Ok(value) => serde_json::to_string_pretty(&value).ok(),
Err(e) => {
println!("Error parsing JSON after substitution: {}", e);
None
@matthewjberger
matthewjberger / message.rs
Created September 4, 2024 20:54
Pub/sub broker messaging in-process without an async executor using Send + Sync compatible types
use std::{
collections::HashMap,
sync::{Arc, RwLock, Weak},
};
use std::{
collections::VecDeque,
sync::{RwLockReadGuard, RwLockWriteGuard},
};
use uuid::Uuid;
@matthewjberger
matthewjberger / Cargo.toml
Last active August 28, 2024 15:09
Framegraphs in rust
[package]
name = "framegraph-system"
version = "0.1.0"
edition = "2021"
[dependencies]
petgraph = "0.6.3"
wgpu = "0.15"
pollster = "0.3"
@matthewjberger
matthewjberger / main.rs
Created August 27, 2024 16:52
Rust Job Graphs
// [dependencies]
// futures = "0.3.30"
// petgraph = "0.6.5"
// tokio = { version = "1.39.3", features = ["full"] }
use futures::future::join_all;
use petgraph::graph::{DiGraph, NodeIndex};
use std::{
collections::HashMap,
sync::{Arc, Mutex},