Bel LaPointe 2025-03-02 13:34:38 -07:00
parent c2f05eaeb0
commit b04ab122eb
12 changed files with 357 additions and 109 deletions

View File

@ -1,3 +0,0 @@
[gd_scene format=3 uid="uid://dg85xsdqg6wj0"]
[node name="Node2D" type="Node2D"]

View File

@ -0,0 +1,14 @@
[configuration]
entry_symbol = "gdext_rust_init"
compatibility_minimum = 4.1
reloadable = true
[libraries]
linux.debug.x86_64 = "res://../rust/target/debug/libprice_is_wrong.so"
linux.release.x86_64 = "res://../rust/target/release/libprice_is_wrong.so"
windows.debug.x86_64 = "res://../rust/target/debug/price_is_wrong.dll"
windows.release.x86_64 = "res://../rust/target/release/price_is_wrong.dll"
macos.debug = "res://../rust/target/debug/libprice_is_wrong.dylib"
macos.release = "res://../rust/target/release/libprice_is_wrong.dylib"
macos.debug.arm64 = "res://../rust/target/debug/libprice_is_wrong.dylib"
macos.release.arm64 = "res://../rust/target/release/libprice_is_wrong.dylib"

View File

@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://dg85xsdqg6wj0"]
[ext_resource type="Texture2D" uid="uid://cneqjngiworik" path="res://icon.svg" id="1_swwii"]
[node name="Node2D" type="Node2D"]
[node name="BreeLPlayer" type="BreeLPlayer" parent="."]
position = Vector2(556, 302)
texture = ExtResource("1_swwii")

View File

Before

Width:  |  Height:  |  Size: 994 B

After

Width:  |  Height:  |  Size: 994 B

View File

@ -11,6 +11,7 @@ config_version=5
[application]
config/name="price-is-wrong"
run/main_scene="res://gd/node_2d.tscn"
config/features=PackedStringArray("4.3", "GL Compatibility")
config/icon="res://icon.svg"

186
src/rust/Cargo.lock generated
View File

@ -2,6 +2,15 @@
# It is not intended for manual editing.
version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.96"
@ -186,6 +195,24 @@ dependencies = [
"slab",
]
[[package]]
name = "gdextension-api"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af8707eca996b28193b772a4a9a28a97364bb93c97e3c313542e812f2963fb93"
[[package]]
name = "gensym"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "913dce4c5f06c2ea40fc178c06f777ac89fc6b1383e90c254fafb1abe4ba3c82"
dependencies = [
"proc-macro2",
"quote",
"syn",
"uuid",
]
[[package]]
name = "getrandom"
version = "0.3.1"
@ -198,12 +225,101 @@ dependencies = [
"windows-targets",
]
[[package]]
name = "glam"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94"
[[package]]
name = "glob"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "godot"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a29a3646d4b02bf4587fedba4ac7b44a47d45c933fd85ba7e61292408818eaa4"
dependencies = [
"godot-core",
"godot-macros",
]
[[package]]
name = "godot-bindings"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0014540bff93ba275031bc852f1cf9a3ff3216f02cdd51dc249745dccc8c578"
dependencies = [
"gdextension-api",
]
[[package]]
name = "godot-cell"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88184d525d763ebc88ff6806ffee35e19c7118d5c9e4eedbc74e70e069f8a671"
[[package]]
name = "godot-codegen"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caa72d9b8be812fef2932f2a172b80c8b3feaee030571682f8f770c3d1c348d8"
dependencies = [
"godot-bindings",
"heck",
"nanoserde",
"proc-macro2",
"quote",
"regex",
]
[[package]]
name = "godot-core"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ff8345372e4c990ca592d7b61490ef88ff249fc77226f5b79beca173b4a0458"
dependencies = [
"glam",
"godot-bindings",
"godot-cell",
"godot-codegen",
"godot-ffi",
]
[[package]]
name = "godot-ffi"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "606d08085bd590d2f9c72633d4d218fee665ab3a0760b2d9daff2d964d628def"
dependencies = [
"gensym",
"godot-bindings",
"godot-codegen",
"libc",
"paste",
]
[[package]]
name = "godot-macros"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c11b3188e54ebacf88feb4c968ed19048a71a329c4cfd4a06cf374f18357a36"
dependencies = [
"godot-bindings",
"proc-macro2",
"quote",
"venial",
]
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "itoa"
version = "1.0.14"
@ -228,6 +344,21 @@ version = "2.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
[[package]]
name = "nanoserde"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5de9cf844ab1e25a0353525bd74cb889843a6215fa4a0d156fd446f4857a1b99"
dependencies = [
"nanoserde-derive",
]
[[package]]
name = "nanoserde-derive"
version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e943b2c21337b7e3ec6678500687cdc741b7639ad457f234693352075c082204"
[[package]]
name = "native_db"
version = "0.8.1"
@ -287,6 +418,12 @@ version = "1.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pin-project-lite"
version = "0.2.16"
@ -304,6 +441,7 @@ name = "price-is-wrong"
version = "0.1.0"
dependencies = [
"futures",
"godot",
"native_db",
"native_model",
"serde",
@ -356,6 +494,35 @@ dependencies = [
"libc",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "rustix"
version = "0.38.44"
@ -506,6 +673,25 @@ version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
[[package]]
name = "uuid"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587"
dependencies = [
"getrandom",
]
[[package]]
name = "venial"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a42528baceab6c7784446df2a10f4185078c39bf73dc614f154353f1a6b1229"
dependencies = [
"proc-macro2",
"quote",
]
[[package]]
name = "version_check"
version = "0.9.5"

View File

@ -5,6 +5,10 @@ edition = "2024"
[dependencies]
futures = "0.3.31"
godot = "0.2.4"
native_db = "0.8.1"
native_model = "0.4.20"
serde = "1.0.218"
[lib]
crate-type = ["cdylib"]

111
src/rust/src/db.rs Normal file
View File

@ -0,0 +1,111 @@
mod main {
use {super::data};
pub fn main() {
let db = data::DB::new().expect("could not make db");
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_main() {
main();
}
}
}
mod data {
mod models {
use {
native_db::{
native_db,
ToKey,
},
native_model::{
native_model,
Model,
},
serde::{Deserialize, Serialize},
};
pub mod v1 {
use super::*;
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[native_model(id = 1, version = 1)]
#[native_db]
pub struct Person {
#[primary_key]
pub name: String,
}
}
}
use native_db::*;
pub type Person = models::v1::Person;
static MODELS: std::sync::LazyLock<Models> = std::sync::LazyLock::new(|| {
let mut models = Models::new();
models.define::<Person>().expect("failed to define person");
models
});
pub struct DB<'a> {
db: Database<'a>,
}
impl<'a> DB<'a> {
pub fn new() -> Result<DB<'a>, String> {
let db = match Builder::new().create_in_memory(&MODELS) {
Ok(db) => Ok(db),
Err(msg) => Err(msg.to_string()),
}?;
Ok(DB{
db: db,
})
}
pub fn insert<T: ToInput>(self: &DB<'a>, v: T) -> Result<(), String> {
let t = match self.db.rw_transaction() {
Ok(t) => t,
Err(msg) => return Err(msg.to_string()),
};
if let Err(msg) = t.insert(v) {
return Err(msg.to_string());
}
if let Err(msg) = t.commit() {
return Err(msg.to_string());
}
Ok(())
}
pub fn get<T: ToInput, S: ToKey>(self: &DB<'a>, primary: S) -> Result<Option<T>, String> {
let t = match self.db.r_transaction() {
Ok(t) => t,
Err(msg) => return Err(msg.to_string()),
};
match t.get().primary(primary) {
Ok(v) => Ok(v),
Err(msg) => Err(msg.to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mvp() {
let db = DB::new().expect("could not make db");
let person = Person{name: "me".to_string()};
db.insert(person.clone()).expect("could not insert person");
assert_eq!(person, db.get("me".to_string()).expect("could not get").expect("got none"));
}
}
}

View File

@ -1,110 +1,9 @@
mod main {
use {super::data};
use godot::prelude::*;
pub fn main() {
let db = data::DB::new().expect("could not make db");
}
struct MyExtension;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_main() {
main();
}
}
}
mod data {
mod models {
use {
native_db::{
native_db,
ToKey,
},
native_model::{
native_model,
Model,
},
serde::{Deserialize, Serialize},
};
pub mod v1 {
use super::*;
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
#[native_model(id = 1, version = 1)]
#[native_db]
pub struct Person {
#[primary_key]
pub name: String,
}
}
}
use native_db::*;
pub type Person = models::v1::Person;
static MODELS: std::sync::LazyLock<Models> = std::sync::LazyLock::new(|| {
let mut models = Models::new();
models.define::<Person>().expect("failed to define person");
models
});
pub struct DB<'a> {
db: Database<'a>,
}
impl<'a> DB<'a> {
pub fn new() -> Result<DB<'a>, String> {
let db = match Builder::new().create_in_memory(&MODELS) {
Ok(db) => Ok(db),
Err(msg) => Err(msg.to_string()),
}?;
Ok(DB{
db: db,
})
}
pub fn insert<T: ToInput>(self: &DB<'a>, v: T) -> Result<(), String> {
let t = match self.db.rw_transaction() {
Ok(t) => t,
Err(msg) => return Err(msg.to_string()),
};
if let Err(msg) = t.insert(v) {
return Err(msg.to_string());
}
if let Err(msg) = t.commit() {
return Err(msg.to_string());
}
Ok(())
}
pub fn get<T: ToInput, S: ToKey>(self: &DB<'a>, primary: S) -> Result<Option<T>, String> {
let t = match self.db.r_transaction() {
Ok(t) => t,
Err(msg) => return Err(msg.to_string()),
};
match t.get().primary(primary) {
Ok(v) => Ok(v),
Err(msg) => Err(msg.to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn mvp() {
let db = DB::new().expect("could not make db");
let person = Person{name: "me".to_string()};
db.insert(person.clone()).expect("could not insert person");
assert_eq!(person, db.get("me".to_string()).expect("could not get").expect("got none"));
}
}
#[gdextension]
unsafe impl ExtensionLibrary for MyExtension {
}
pub mod player;

27
src/rust/src/player.rs Normal file
View File

@ -0,0 +1,27 @@
use godot::{prelude::*, classes::{ISprite2D, Sprite2D}};
#[derive(GodotClass)]
#[class(base=Sprite2D)]
struct BreeLPlayer {
base: Base<Sprite2D>
}
#[godot_api]
impl ISprite2D for BreeLPlayer {
fn init(base: Base<Sprite2D>) -> Self {
eprintln!("init");
BreeLPlayer{base: base}
}
fn physics_process(&mut self, delta: f64) {
eprintln!("physics_process({delta})");
}
}
#[godot_api]
impl BreeLPlayer {
fn drop(&mut self) {
eprintln!("drop");
}
}