✨♻️ bevy_vanth, vanth, vanth_derive, flake: Add Bevy integration crate and refactor entity/networking
- Created new crate `bevy_vanth` with basic plugin structure for Bevy integration. - Refactored `Id` generation in `vanth` to use `OsRng` and removed redundant `to_u128_pair`/`from_u128_pair` methods. - Moved networking functionality into new `net` module with `Node`, `Packet`, and `Message` types. - Updated `vanth_derive` to use `proc-macro-crate` for reliable crate path resolution. - Added `rand` dependency to replace custom ID generation logic. - Updated `Cargo.toml`/`Cargo.lock` with new dependencies: `bevy_app`, `nix`, `cfg_aliases`, `proc-macro-crate`. - Modified `README.md` with improved project description. - Added commented clippy check in `flake.nix`.
This commit is contained in:
parent
5262a266c0
commit
3b193c5aa3
13 changed files with 298 additions and 127 deletions
101
Cargo.lock
generated
101
Cargo.lock
generated
|
@ -141,6 +141,37 @@ version = "1.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bevy_app"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4491cc4c718ae76b4c6883df58b94cc88b32dcd894ea8d5b603c7c7da72ca967"
|
||||||
|
dependencies = [
|
||||||
|
"bevy_derive",
|
||||||
|
"bevy_ecs",
|
||||||
|
"bevy_platform",
|
||||||
|
"bevy_reflect",
|
||||||
|
"bevy_tasks",
|
||||||
|
"bevy_utils",
|
||||||
|
"cfg-if",
|
||||||
|
"ctrlc",
|
||||||
|
"downcast-rs",
|
||||||
|
"log",
|
||||||
|
"thiserror",
|
||||||
|
"variadics_please",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bevy_derive"
|
||||||
|
version = "0.16.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1b837bf6c51806b10ebfa9edf1844ad80a3a0760d6c5fac4e90761df91a8901a"
|
||||||
|
dependencies = [
|
||||||
|
"bevy_macro_utils",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bevy_ecs"
|
name = "bevy_ecs"
|
||||||
version = "0.16.1"
|
version = "0.16.1"
|
||||||
|
@ -282,6 +313,14 @@ dependencies = [
|
||||||
"thread_local",
|
"thread_local",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bevy_vanth"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bevy_app",
|
||||||
|
"bevy_ecs",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.9.1"
|
version = "2.9.1"
|
||||||
|
@ -352,6 +391,12 @@ version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg_aliases"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.42"
|
version = "4.5.42"
|
||||||
|
@ -445,6 +490,16 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ctrlc"
|
||||||
|
version = "3.4.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73"
|
||||||
|
dependencies = [
|
||||||
|
"nix",
|
||||||
|
"windows-sys",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "derive_more"
|
name = "derive_more"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
|
@ -750,6 +805,18 @@ version = "2.7.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
|
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nix"
|
||||||
|
version = "0.30.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"cfg-if",
|
||||||
|
"cfg_aliases",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nonmax"
|
name = "nonmax"
|
||||||
version = "0.5.5"
|
version = "0.5.5"
|
||||||
|
@ -876,6 +943,15 @@ dependencies = [
|
||||||
"termtree",
|
"termtree",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro-crate"
|
||||||
|
version = "3.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35"
|
||||||
|
dependencies = [
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.95"
|
version = "1.0.95"
|
||||||
|
@ -901,10 +977,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_chacha"
|
name = "rand"
|
||||||
version = "0.3.1"
|
version = "0.9.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
|
||||||
|
dependencies = [
|
||||||
|
"rand_chacha",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core",
|
"rand_core",
|
||||||
|
@ -913,9 +999,12 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.4"
|
version = "0.9.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
|
@ -1260,6 +1349,7 @@ dependencies = [
|
||||||
"bevy_ecs",
|
"bevy_ecs",
|
||||||
"blake3",
|
"blake3",
|
||||||
"digest",
|
"digest",
|
||||||
|
"rand",
|
||||||
"rusqlite",
|
"rusqlite",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -1286,6 +1376,7 @@ dependencies = [
|
||||||
name = "vanth_derive"
|
name = "vanth_derive"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"proc-macro-crate",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn",
|
||||||
|
|
|
@ -12,6 +12,7 @@ name = "vanth"
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
clap = { version = "4.5.42", features = ["derive"] }
|
clap = { version = "4.5.42", features = ["derive"] }
|
||||||
bevy_ecs = "0.16.1"
|
bevy_ecs = "0.16.1"
|
||||||
|
bevy_app = "0.16.1"
|
||||||
bincode = "2.0.1"
|
bincode = "2.0.1"
|
||||||
serde = { version = "1.0.219", features = ["derive"] }
|
serde = { version = "1.0.219", features = ["derive"] }
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.140"
|
||||||
|
@ -22,8 +23,10 @@ syn = { version = "2.0", features = ["full"] }
|
||||||
proc-macro2 = "1.0"
|
proc-macro2 = "1.0"
|
||||||
rusqlite = { version = "0.32.1", features = ["bundled"] }
|
rusqlite = { version = "0.32.1", features = ["bundled"] }
|
||||||
tempfile = "3.12.0"
|
tempfile = "3.12.0"
|
||||||
rand_core = "0.6.4"
|
rand = "0.9.2"
|
||||||
rand_chacha = { version = "0.3.1", features = ["serde1"] }
|
rand_chacha = { version = "0.9.0", features = ["serde"] }
|
||||||
|
rand_core = "0.9.0"
|
||||||
tracing = "0.1.41"
|
tracing = "0.1.41"
|
||||||
tracing-subscriber = "0.3.19"
|
tracing-subscriber = "0.3.19"
|
||||||
assert_cmd = "2.0.17"
|
assert_cmd = "2.0.17"
|
||||||
|
proc-macro-crate = "3.3.0"
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
# Vanth
|
# Vanth
|
||||||
|
|
||||||
Vanth is a content-addressed database as a library designed for entity-component-system (ECS) applications.
|
Vanth is a content-addressed data storage and task memoization framework designed for entity-component-system (ECS) applications.
|
||||||
|
|
||||||
|
Inspired by [Salsa](https://github.com/salsa-rs/salsa) and [Bevy](https://bevy.org/).
|
||||||
|
|
||||||
It is currently experimental and should not be used for anything.
|
It is currently experimental and should not be used for anything.
|
||||||
|
|
||||||
|
|
8
crates/bevy_vanth/Cargo.toml
Normal file
8
crates/bevy_vanth/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "bevy_vanth"
|
||||||
|
version.workspace = true
|
||||||
|
edition.workspace = true
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bevy_ecs.workspace = true
|
||||||
|
bevy_app.workspace = true
|
20
crates/bevy_vanth/src/lib.rs
Normal file
20
crates/bevy_vanth/src/lib.rs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
use bevy_app::Plugin;
|
||||||
|
use bevy_ecs::component::Component;
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct VanthRoot {}
|
||||||
|
|
||||||
|
pub struct VanthPlugin {}
|
||||||
|
|
||||||
|
impl Plugin for VanthPlugin {
|
||||||
|
fn build(&self, app: &mut bevy_app::App) {
|
||||||
|
// TODO: Allow specifying custom schedules.
|
||||||
|
app.add_systems(bevy_app::FixedPreUpdate, run_vanth).finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VanthPlugin {}
|
||||||
|
|
||||||
|
fn run_vanth() {
|
||||||
|
|
||||||
|
}
|
|
@ -16,6 +16,7 @@ blake3.workspace = true
|
||||||
vanth_derive = { path = "../vanth_derive" }
|
vanth_derive = { path = "../vanth_derive" }
|
||||||
rusqlite.workspace = true
|
rusqlite.workspace = true
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
|
rand = { workspace = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = { workspace = true }
|
tempfile = { workspace = true }
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use serde::{Deserialize, Serialize};
|
// use serde::{Deserialize, Serialize};
|
||||||
use vanth::{hash, Vanth};
|
// use vanth::{hash, Vanth};
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize, Vanth)]
|
// #[derive(Clone, Debug, Deserialize, Serialize, Vanth)]
|
||||||
struct Foo {
|
// struct Foo {
|
||||||
value: i32,
|
// value: i32,
|
||||||
}
|
// }
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = "hello";
|
// let x = "hello";
|
||||||
println!("Hash: {:?}", hash(&x).hex());
|
// println!("Hash: {:?}", hash(&x).hex());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
|
use crate::hash;
|
||||||
|
use crate::hashing_serializer::{self, HashingSerializer};
|
||||||
|
use rand::rngs::OsRng;
|
||||||
|
use rand::TryRngCore;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fmt::{self, Debug, Display};
|
use std::fmt::{self, Debug, Display};
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
use crate::hash;
|
|
||||||
use crate::hashing_serializer::{self, HashingSerializer};
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Deserialize)]
|
#[derive(Clone, Copy, Deserialize)]
|
||||||
pub struct EntityId([u8; 32]);
|
pub struct EntityId([u8; 32]);
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@ impl From<String> for EntityId {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A generic identifier type that can be used for different entity types
|
/// A generic identifier type that can be used for different entity types
|
||||||
#[derive(Clone, Copy, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||||
pub struct Id<T: ?Sized> {
|
pub struct Id<T: ?Sized> {
|
||||||
/// The raw identifier value
|
/// The raw identifier value
|
||||||
pub value: [u8; 32],
|
pub value: [u8; 32],
|
||||||
|
@ -37,14 +38,7 @@ impl<T: ?Sized> Id<T> {
|
||||||
/// Generate a random ID
|
/// Generate a random ID
|
||||||
pub fn random() -> Self {
|
pub fn random() -> Self {
|
||||||
let mut value = [0u8; 32];
|
let mut value = [0u8; 32];
|
||||||
// Simple random generation for demonstration
|
OsRng.try_fill_bytes(&mut value).unwrap();
|
||||||
for i in 0..32 {
|
|
||||||
value[i] = (std::time::SystemTime::now()
|
|
||||||
.duration_since(std::time::UNIX_EPOCH)
|
|
||||||
.unwrap()
|
|
||||||
.as_nanos() as u8)
|
|
||||||
.wrapping_add(i as u8);
|
|
||||||
}
|
|
||||||
Self::new(value)
|
Self::new(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,42 +61,6 @@ impl<T: ?Sized> Id<T> {
|
||||||
}
|
}
|
||||||
Self::new(bytes)
|
Self::new(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert the ID to a pair of u128 values for handling larger values
|
|
||||||
/// Returns (high_bits, low_bits)
|
|
||||||
pub fn to_u128_pair(&self) -> (u128, u128) {
|
|
||||||
let mut high = 0u128;
|
|
||||||
let mut low = 0u128;
|
|
||||||
|
|
||||||
// First 16 bytes go to low
|
|
||||||
for i in 0..16 {
|
|
||||||
low |= (self.value[i] as u128) << (i * 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next 16 bytes go to high
|
|
||||||
for i in 0..16 {
|
|
||||||
high |= (self.value[i + 16] as u128) << (i * 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
(high, low)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create an ID from a pair of u128 values
|
|
||||||
pub fn from_u128_pair(high: u128, low: u128) -> Self {
|
|
||||||
let mut bytes = [0u8; 32];
|
|
||||||
|
|
||||||
// Low bits fill first 16 bytes
|
|
||||||
for i in 0..16 {
|
|
||||||
bytes[i] = ((low >> (i * 8)) & 0xFF) as u8;
|
|
||||||
}
|
|
||||||
|
|
||||||
// High bits fill next 16 bytes
|
|
||||||
for i in 0..16 {
|
|
||||||
bytes[i + 16] = ((high >> (i * 8)) & 0xFF) as u8;
|
|
||||||
}
|
|
||||||
|
|
||||||
Self::new(bytes)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> PartialEq for Id<T> {
|
impl<T: ?Sized> PartialEq for Id<T> {
|
||||||
|
@ -119,20 +77,6 @@ impl<T: ?Sized> Hash for Id<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: ?Sized> Debug for Id<T> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
let (high, low) = self.to_u128_pair();
|
|
||||||
write!(f, "Id<{}>({:016x}{:016x})", std::any::type_name::<T>(), high, low)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: ?Sized> Display for Id<T> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
let (high, low) = self.to_u128_pair();
|
|
||||||
write!(f, "{:016x}{:016x}", high, low)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ContentHash {
|
pub struct ContentHash {
|
||||||
value: [u8; 32],
|
value: [u8; 32],
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,10 +7,12 @@ use crate::entity::EntityId;
|
||||||
|
|
||||||
pub mod entity;
|
pub mod entity;
|
||||||
pub mod hashing_serializer;
|
pub mod hashing_serializer;
|
||||||
|
pub mod net;
|
||||||
pub mod nix;
|
pub mod nix;
|
||||||
pub mod store;
|
pub mod store;
|
||||||
|
|
||||||
pub use hashing_serializer::hash;
|
pub use hashing_serializer::hash;
|
||||||
|
pub use net::Node;
|
||||||
pub use vanth_derive::Vanth;
|
pub use vanth_derive::Vanth;
|
||||||
|
|
||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
@ -19,41 +21,6 @@ pub enum Error {
|
||||||
Other(String),
|
Other(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// A view of all of the [`Node`]s in a cluster.
|
|
||||||
pub struct Network {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A Vanth server.
|
|
||||||
pub struct Node {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Node {
|
|
||||||
pub fn new() -> Self {
|
|
||||||
Self {}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn entity_count(&self) -> usize {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn run() {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn save(entity_id: impl Into<EntityId>) -> Result<()> {
|
|
||||||
// TODO
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
// pub fn load(entity_id: impl Into<EntityId>) -> Result<Option<EntityContents>> {
|
|
||||||
// // TODO
|
|
||||||
// Ok(None)
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
pub struct HashedValue {
|
pub struct HashedValue {
|
||||||
content_hash: ContentHash,
|
content_hash: ContentHash,
|
||||||
|
@ -75,9 +42,15 @@ pub struct Value {
|
||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash)]
|
||||||
|
pub struct EventTy(Ty);
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash)]
|
||||||
|
pub struct TaskTy(Ty);
|
||||||
|
|
||||||
/// A wrapper for the fully-qualified name of a Rust type. This should be univerisally unique for a given type within a
|
/// A wrapper for the fully-qualified name of a Rust type. This should be univerisally unique for a given type within a
|
||||||
/// given project.
|
/// given project.
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize, Eq, Hash)]
|
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq, Hash)]
|
||||||
pub struct Ty {
|
pub struct Ty {
|
||||||
pub path: Vec<String>,
|
pub path: Vec<String>,
|
||||||
}
|
}
|
||||||
|
@ -88,12 +61,6 @@ impl ToString for Ty {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialEq for Ty {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
self.path == other.path
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: AsRef<str>> PartialEq<T> for Ty {
|
impl<T: AsRef<str>> PartialEq<T> for Ty {
|
||||||
fn eq(&self, other: &T) -> bool {
|
fn eq(&self, other: &T) -> bool {
|
||||||
self.to_string() == *other.as_ref()
|
self.to_string() == *other.as_ref()
|
||||||
|
@ -182,5 +149,49 @@ pub struct Handle<T> {
|
||||||
_marker: PhantomData<T>,
|
_marker: PhantomData<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait Task {
|
||||||
|
type Output: Vanth + Serialize + DeserializeOwned;
|
||||||
|
|
||||||
|
// TODO: Make async?
|
||||||
|
fn execute(self) -> Self::Output;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A representation of the approximate computational cost of completing a task.
|
||||||
|
pub struct Cost {
|
||||||
|
value: f64,
|
||||||
|
}
|
||||||
|
|
||||||
/// A world which Vanth entities live in. Lifetimes `'v` of [`Vanth<'v>`] types are tied to the lifetime of the `Root`.
|
/// A world which Vanth entities live in. Lifetimes `'v` of [`Vanth<'v>`] types are tied to the lifetime of the `Root`.
|
||||||
pub struct Root {}
|
pub struct Root {
|
||||||
|
current_epoch: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Module {
|
||||||
|
fn register(world_context: &mut ModuleRegistration);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ModuleRegistration {
|
||||||
|
events: Vec<EventTy>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModuleRegistration {}
|
||||||
|
|
||||||
|
pub trait ModuleTools: Module {
|
||||||
|
type Tool: Tool;
|
||||||
|
|
||||||
|
fn tools(&self) -> impl Iterator<Item = Self::Tool>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Tool: Send + Sync {
|
||||||
|
type Input;
|
||||||
|
type Output;
|
||||||
|
type Error: std::error::Error;
|
||||||
|
|
||||||
|
fn name<'a>() -> &'a str;
|
||||||
|
fn description<'a>() -> &'a str;
|
||||||
|
|
||||||
|
fn call(
|
||||||
|
&self,
|
||||||
|
input: Self::Input,
|
||||||
|
) -> impl Future<Output = std::result::Result<Self::Output, Self::Error>> + Send;
|
||||||
|
}
|
||||||
|
|
63
crates/vanth/src/net.rs
Normal file
63
crates/vanth/src/net.rs
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::{Error, Result};
|
||||||
|
use crate::{
|
||||||
|
Vanth,
|
||||||
|
entity::{EntityId, Id},
|
||||||
|
};
|
||||||
|
|
||||||
|
pub struct Packet {
|
||||||
|
pub source_node: Id<Node>,
|
||||||
|
pub signature: Vec<u8>,
|
||||||
|
pub message: Message,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize, Vanth)]
|
||||||
|
pub struct Message {
|
||||||
|
pub events: Vec<Event>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize, Serialize, Vanth)]
|
||||||
|
pub enum Event {}
|
||||||
|
|
||||||
|
/// A view of all of the [`Node`]s in a cluster.
|
||||||
|
pub struct Network {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A Vanth server.
|
||||||
|
pub struct Node {
|
||||||
|
id: Id<Node>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Node {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
id: Id::random(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_id(id: Id<Node>) -> Self {
|
||||||
|
Self {
|
||||||
|
id,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn entity_count(&self) -> usize {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run() {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn save(entity_id: impl Into<EntityId>) -> Result<()> {
|
||||||
|
// TODO
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
// pub fn load(entity_id: impl Into<EntityId>) -> Result<Option<EntityContents>> {
|
||||||
|
// // TODO
|
||||||
|
// Ok(None)
|
||||||
|
// }
|
||||||
|
}
|
|
@ -10,3 +10,4 @@ proc-macro = true
|
||||||
quote.workspace = true
|
quote.workspace = true
|
||||||
syn.workspace = true
|
syn.workspace = true
|
||||||
proc-macro2.workspace = true
|
proc-macro2.workspace = true
|
||||||
|
proc-macro-crate.workspace = true
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
use proc_macro_crate::{crate_name, FoundCrate};
|
||||||
|
use proc_macro2::Span;
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use syn::parse_quote;
|
use syn::parse_quote;
|
||||||
use syn::{DeriveInput, GenericParam, Generics, parse_macro_input};
|
use syn::{DeriveInput, GenericParam, Generics, parse_macro_input};
|
||||||
|
@ -11,6 +13,15 @@ pub fn vanth_derive(input: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
let mut generics = input.generics.clone();
|
let mut generics = input.generics.clone();
|
||||||
|
|
||||||
|
let vanth_path = match crate_name("vanth") {
|
||||||
|
Ok(FoundCrate::Itself) => quote!(crate),
|
||||||
|
Ok(FoundCrate::Name(name)) => {
|
||||||
|
let ident = syn::Ident::new(&name, Span::call_site());
|
||||||
|
quote!(#ident)
|
||||||
|
}
|
||||||
|
Err(_) => quote!(vanth),
|
||||||
|
};
|
||||||
|
|
||||||
let type_params: Vec<syn::Ident> = generics
|
let type_params: Vec<syn::Ident> = generics
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -25,7 +36,7 @@ pub fn vanth_derive(input: TokenStream) -> TokenStream {
|
||||||
|
|
||||||
let mut where_clause = generics.where_clause.clone().unwrap_or_else(|| parse_quote!(where));
|
let mut where_clause = generics.where_clause.clone().unwrap_or_else(|| parse_quote!(where));
|
||||||
for tp in &type_params {
|
for tp in &type_params {
|
||||||
where_clause.predicates.push(parse_quote!(#tp : vanth::Vanth));
|
where_clause.predicates.push(parse_quote!(#tp : #vanth_path::Vanth));
|
||||||
}
|
}
|
||||||
|
|
||||||
let (impl_generics, ty_generics, _) = generics.split_for_impl();
|
let (impl_generics, ty_generics, _) = generics.split_for_impl();
|
||||||
|
@ -34,19 +45,19 @@ pub fn vanth_derive(input: TokenStream) -> TokenStream {
|
||||||
quote! { String::new() }
|
quote! { String::new() }
|
||||||
} else {
|
} else {
|
||||||
quote! {
|
quote! {
|
||||||
format!("<{}>", [#(#type_params::ty().path.join("::")),*].join(","))
|
format!("<{}>", [#( <#type_params as #vanth_path::Vanth>::ty().path.join("::") ),*].join(","))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let expanded = quote! {
|
let expanded = quote! {
|
||||||
impl #impl_generics vanth::Vanth for #name #ty_generics #where_clause {
|
impl #impl_generics #vanth_path::Vanth for #name #ty_generics #where_clause {
|
||||||
fn ty() -> vanth::Ty {
|
fn ty() -> #vanth_path::Ty {
|
||||||
let module_path = module_path!();
|
let module_path = module_path!();
|
||||||
let mut path: Vec<String> = module_path.split("::").map(|s| s.to_string()).collect();
|
let mut path: Vec<String> = module_path.split("::").map(|s| s.to_string()).collect();
|
||||||
let base_name = stringify!(#name);
|
let base_name = stringify!(#name);
|
||||||
let generics_str = #generics_code;
|
let generics_str = #generics_code;
|
||||||
path.push(format!("{}{}", base_name, generics_str));
|
path.push(format!("{}{}", base_name, generics_str));
|
||||||
vanth::Ty { path }
|
#vanth_path::Ty { path }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
16
flake.nix
16
flake.nix
|
@ -94,6 +94,18 @@
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
clippyCheck = craneLib.cargoClippy (
|
||||||
|
commonArgs
|
||||||
|
// craneArgs
|
||||||
|
// {
|
||||||
|
inherit cargoArtifacts;
|
||||||
|
pname = "vanth-clippy";
|
||||||
|
version = "0.1.0";
|
||||||
|
# Fail on any lint warning and cover all targets/features.
|
||||||
|
cargoClippyExtraArgs = "--all-targets --all-features -- -D warnings";
|
||||||
|
}
|
||||||
|
);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages = rec {
|
packages = rec {
|
||||||
|
@ -101,6 +113,10 @@
|
||||||
default = vanth;
|
default = vanth;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
checks = {
|
||||||
|
# clippy = clippyCheck;
|
||||||
|
};
|
||||||
|
|
||||||
devShells.default = craneLib.devShell {
|
devShells.default = craneLib.devShell {
|
||||||
inputsFrom = [ vanth ];
|
inputsFrom = [ vanth ];
|
||||||
packages = packages;
|
packages = packages;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue