-
Notifications
You must be signed in to change notification settings - Fork 188
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(lang): add members to world store and re added model tests #2611
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,4 +1,4 @@ | ||||||||||||||||||||||||||
use dojo::model::model_value::ModelValueKey; | ||||||||||||||||||||||||||
use dojo::{model::model_value::ModelValueKey, utils::entity_id_from_keys}; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
// TODO: define the right interface for member accesses. | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
@@ -12,24 +12,42 @@ pub enum ModelPtr<M> { | |||||||||||||||||||||||||
Keys: Span<felt252>, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
pub trait ModelPtrTrait<M> { | ||||||||||||||||||||||||||
/// Returns the entity id of the model. | ||||||||||||||||||||||||||
fn entity_id(self: @ModelPtr<M>) -> felt252; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
pub impl ModelPtrImpl<M> of ModelPtrTrait<M> { | ||||||||||||||||||||||||||
/// Returns the entity id of the model. | ||||||||||||||||||||||||||
fn entity_id(self: @ModelPtr<M>) -> felt252 { | ||||||||||||||||||||||||||
match self { | ||||||||||||||||||||||||||
ModelPtr::Id(id) => *id, | ||||||||||||||||||||||||||
ModelPtr::Keys(keys) => entity_id_from_keys(*keys), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
/// A `ModelStorage` trait that abstracts where the storage is. | ||||||||||||||||||||||||||
/// | ||||||||||||||||||||||||||
/// Currently it's only world storage, but this will be useful when we have other | ||||||||||||||||||||||||||
/// storage solutions (micro worlds). | ||||||||||||||||||||||||||
pub trait ModelStorage<S, M> { | ||||||||||||||||||||||||||
/// Sets a model of type `M`. | ||||||||||||||||||||||||||
fn write_model(ref self: S, model: @M); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
/// Retrieves a model of type `M` using the provided key of type `K`. | ||||||||||||||||||||||||||
fn read_model<K, +Drop<K>, +Serde<K>>(self: @S, key: K) -> M; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
/// Deletes a model of type `M`. | ||||||||||||||||||||||||||
fn erase_model(ref self: S, model: @M); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
/// Deletes a model of type `M` using the provided entity id. | ||||||||||||||||||||||||||
/// The ptr is mostly used for type inferrence. | ||||||||||||||||||||||||||
fn erase_model_ptr(ref self: S, ptr: ModelPtr<M>); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
/// Retrieves a model of type `M` using the provided entity idref . | ||||||||||||||||||||||||||
fn read_member<T, +Serde<T>>(self: @S, ptr: ModelPtr<M>, field_selector: felt252) -> T; | ||||||||||||||||||||||||||
/// Retrieves a model of type `M` using the provided entity id. | ||||||||||||||||||||||||||
fn write_member<T, +Serde<T>, +Drop<T>>( | ||||||||||||||||||||||||||
ref self: S, ptr: ModelPtr<M>, field_selector: felt252, value: T | ||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||
/// Returns the current namespace hash. | ||||||||||||||||||||||||||
Comment on lines
+45
to
+50
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct the documentation comments to match the methods' functionality Ohayo, sensei! The documentation comments for Apply this diff to correct the documentation comments: - /// Retrieves a model of type `M` using the provided entity idref .
+ /// Retrieves a member of a model of type `M` using the provided field selector.
fn read_member<T, +Serde<T>>(self: @S, ptr: ModelPtr<M>, field_selector: felt252) -> T;
- /// Retrieves a model of type `M` using the provided entity id.
+ /// Updates a member of a model of type `M` using the provided field selector.
fn write_member<T, +Serde<T>, +Drop<T>>(
ref self: S, ptr: ModelPtr<M>, field_selector: felt252, value: T
); 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||
fn namespace_hash(self: @S) -> felt252; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,11 +2,14 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use core::panic_with_felt252; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::world::{IWorldDispatcher, IWorldDispatcherTrait, Resource}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::model::{Model, ModelIndex, ModelValueKey, ModelValue, ModelStorage, ModelPtr}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::model::{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Model, ModelIndex, ModelValueKey, ModelValue, ModelStorage, ModelPtr, storage::ModelPtrTrait | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::event::{Event, EventStorage}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::meta::Layout; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use dojo::utils::{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
entity_id_from_key, entity_id_from_keys, serialize_inline, find_model_field_layout | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
entity_id_from_key, entity_id_from_keys, serialize_inline, find_model_field_layout, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deserialize_unwrap | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use starknet::{ContractAddress, ClassHash}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -16,6 +19,13 @@ pub struct WorldStorage { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pub namespace_hash: felt252, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn field_layout_unwrap<M, +Model<M>>(field_selector: felt252) -> Layout { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
match Model::<M>::field_layout(field_selector) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Option::Some(layout) => layout, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Option::None => panic_with_felt252('bad member id') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#[generate_trait] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pub impl WorldStorageInternalImpl of WorldStorageTrait { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn new(world: IWorldDispatcher, namespace: @ByteArray) -> WorldStorage { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -108,6 +118,29 @@ pub impl ModelStorageWorldStorageImpl<M, +Model<M>, +Drop<M>> of ModelStorage<Wo | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Model::<M>::layout() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn read_member<T, +Serde<T>>( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self: @WorldStorage, ptr: ModelPtr<M>, field_selector: felt252 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) -> T { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
deserialize_unwrap( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IWorldDispatcherTrait::entity( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*self.dispatcher, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Model::<M>::selector(*self.namespace_hash), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ModelIndex::MemberId((ptr.entity_id(), field_selector)), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
field_layout_unwrap::<M>(field_selector) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+121
to
+132
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle deserialization errors in Ohayo, sensei! Currently, You could modify the code to handle errors explicitly: fn read_member<T, +Serde<T>>(
self: @WorldStorage, ptr: ModelPtr<M>, field_selector: felt252
) -> T {
- deserialize_unwrap(
+ match deserialize(
IWorldDispatcherTrait::entity(
*self.dispatcher,
Model::<M>::selector(*self.namespace_hash),
ModelIndex::MemberId((ptr.entity_id(), field_selector)),
field_layout_unwrap::<M>(field_selector)
- )
+ )
+ ) {
+ Option::Some(value) => value,
+ Option::None => panic_with_felt252('Deserialization failed for read_member')
+ }
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn write_member<T, +Serde<T>, +Drop<T>>( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ref self: WorldStorage, ptr: ModelPtr<M>, field_selector: felt252, value: T | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IWorldDispatcherTrait::set_entity( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
self.dispatcher, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Model::<M>::selector(self.namespace_hash), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ModelIndex::MemberId((ptr.entity_id(), field_selector)), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
serialize_inline(@value), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
field_layout_unwrap::<M>(field_selector) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+133
to
+143
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ensure error handling in Ohayo, sensei! The You might adjust the code to handle the fn write_member<T, +Serde<T>, +Drop<T>>(
ref self: WorldStorage, ptr: ModelPtr<M>, field_selector: felt252, value: T
) {
+ let layout_option = Model::<M>::field_layout(field_selector);
+ match layout_option {
+ Option::Some(layout) => {
IWorldDispatcherTrait::set_entity(
self.dispatcher,
Model::<M>::selector(self.namespace_hash),
ModelIndex::MemberId((ptr.entity_id(), field_selector)),
serialize_inline(@value),
- field_layout_unwrap::<M>(field_selector)
+ layout
);
+ },
+ Option::None => panic_with_felt252('Field layout not found in write_member')
+ }
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fn namespace_hash(self: @WorldStorage) -> felt252 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*self.namespace_hash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.