Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

some fixes + storage tests + some improvements #6

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions crates/dojo/core-cairo-test/src/tests/model/model.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,21 @@ struct Foo2 {
v2: u32
}


#[derive(Copy, Drop, Serde, Debug)]
#[dojo::model]
struct ModelWithFixedArray {
#[key]
k1: u8,
v1: [u16; 3]
}

fn namespace_def() -> NamespaceDef {
NamespaceDef {
namespace: "dojo_cairo_test", resources: [
TestResource::Model(m_Foo::TEST_CLASS_HASH.try_into().unwrap()),
TestResource::Model(m_Foo2::TEST_CLASS_HASH.try_into().unwrap()),
TestResource::Model(m_ModelWithFixedArray::TEST_CLASS_HASH.try_into().unwrap()),
].span()
}
}
Expand Down Expand Up @@ -181,3 +191,19 @@ fn test_model_ptr_from_entity_id() {
let v1 = world.read_member(ptr, selector!("v1"));
assert!(foo.v1 == v1);
}

#[test]
fn test_model_with_fixed_array() {
let mut world = spawn_foo_world();
let model = ModelWithFixedArray { k1: 1, v1: [4, 32, 256] };

world.write_model(@model);
let read_model: ModelWithFixedArray = world.read_model(model.keys());

assert!(model.v1 == read_model.v1);

world.erase_model(@model);
let read_model: ModelWithFixedArray = world.read_model(model.keys());

assert!(read_model.v1 == [0, 0, 0]);
}
179 changes: 68 additions & 111 deletions crates/dojo/core/src/storage/layout.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -71,20 +71,14 @@ pub fn write_array_layout(
// and then, write array items
let item_layout = *item_layout.at(0);

let mut i = 0;
loop {
if i >= array_len {
break;
}
let key = combine_key(key, i.into());

write_layout(model, key, values, ref offset, item_layout);

i += 1;
};
for i in 0
..array_len {
let key = combine_key(key, i.into());
write_layout(model, key, values, ref offset, item_layout);
};
}

/// Write array layout model record to the world storage.
/// Write fixed array layout model record to the world storage.
///
/// # Arguments
/// * `model` - the model selector.
Expand All @@ -100,16 +94,10 @@ pub fn write_fixed_array_layout(
mut item_layout: Span<(Layout, u32)>
) {
let (item_layout, array_len): (Layout, u32) = *item_layout.pop_front().unwrap();
assert((values.len() - offset) >= array_len, 'Invalid values length');

// first, read array size which is the first felt252 from values
assert(array_len.into() <= database::MAX_ARRAY_LENGTH, 'invalid array length');

// then, write the array size
database::set(model, key, values, offset, [packing::PACKING_MAX_BITS].span());
offset += 1;
// Note: no need to write the array length as it is fixed at compile-time
// and stored in the layout.

// and then, write array items
for i in 0
..array_len {
write_layout(model, combine_key(key, i.into()), values, ref offset, item_layout);
Expand Down Expand Up @@ -155,19 +143,14 @@ pub fn write_byte_array_layout(
pub fn write_struct_layout(
model: felt252, key: felt252, values: Span<felt252>, ref offset: u32, layout: Span<FieldLayout>
) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let field_key = combine_key(key, field_layout.selector);

write_layout(model, field_key, values, ref offset, field_layout.layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let field_key = combine_key(key, field_layout.selector);

i += 1;
}
write_layout(model, field_key, values, ref offset, field_layout.layout);
};
}

/// Write tuple layout model record to the world storage.
Expand All @@ -181,19 +164,14 @@ pub fn write_struct_layout(
pub fn write_tuple_layout(
model: felt252, key: felt252, values: Span<felt252>, ref offset: u32, layout: Span<Layout>
) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let key = combine_key(key, i.into());

write_layout(model, key, values, ref offset, field_layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let key = combine_key(key, i.into());

i += 1;
};
write_layout(model, key, values, ref offset, field_layout);
};
}

pub fn write_enum_layout(
Expand Down Expand Up @@ -247,9 +225,14 @@ pub fn delete_array_layout(model: felt252, key: felt252) {
database::delete(model, key, [packing::PACKING_MAX_BITS].span());
}

/// Delete a fixed array layout model record from the world storage.
///
/// # Arguments
/// * `model` - the model selector.
/// * `key` - the model record key.
/// * `layout` - the model layout.
pub fn delete_fixed_array_layout(model: felt252, key: felt252, mut layout: Span<(Layout, u32)>) {
let (item_layout, array_len): (Layout, u32) = *layout.pop_front().unwrap();
database::delete(model, key, [packing::PACKING_MAX_BITS].span());
for i in 0..array_len {
delete_layout(model, combine_key(key, i.into()), item_layout);
}
Expand Down Expand Up @@ -298,19 +281,14 @@ pub fn delete_layout(model: felt252, key: felt252, layout: Layout) {
/// * `key` - the model record key.
/// * `layout` - list of field layouts.
pub fn delete_struct_layout(model: felt252, key: felt252, layout: Span<FieldLayout>) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let key = combine_key(key, field_layout.selector);

delete_layout(model, key, field_layout.layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let key = combine_key(key, field_layout.selector);

i += 1;
}
delete_layout(model, key, field_layout.layout);
};
}

/// Delete a tuple layout model record from the world storage.
Expand All @@ -320,19 +298,14 @@ pub fn delete_struct_layout(model: felt252, key: felt252, layout: Span<FieldLayo
/// * `key` - the model record key.
/// * `layout` - list of tuple item layouts.
pub fn delete_tuple_layout(model: felt252, key: felt252, layout: Span<Layout>) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let key = combine_key(key, i.into());

delete_layout(model, key, field_layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let key = combine_key(key, i.into());

i += 1;
}
delete_layout(model, key, field_layout);
};
}

pub fn delete_enum_layout(model: felt252, key: felt252, variant_layouts: Span<FieldLayout>) {
Expand Down Expand Up @@ -410,31 +383,24 @@ pub fn read_array_layout(
let item_layout = *layout.at(0);
let array_len: u32 = array_len.try_into().unwrap();

let mut i = 0;
loop {
if i >= array_len {
break;
}

let field_key = combine_key(key, i.into());
read_layout(model, field_key, ref read_data, item_layout);

i += 1;
};
for i in 0
..array_len {
let field_key = combine_key(key, i.into());
read_layout(model, field_key, ref read_data, item_layout);
};
}

/// Read a fixed array layout model record.
///
/// # Arguments
/// * `model` - the model selector
/// * `key` - model record key.
/// * `read_data` - the read data.
/// * `layout` - the array item layout
pub fn read_fixed_array_layout(
model: felt252, key: felt252, ref read_data: Array<felt252>, mut layout: Span<(Layout, u32)>
) {
// read number of array items
let (item_layout, array_len): (Layout, u32) = *layout.pop_front().unwrap();
let res = database::get(model, key, [packing::PACKING_MAX_BITS].span());
assert(res.len() == 1, 'internal database error');

assert(array_len.into() <= database::MAX_ARRAY_LENGTH, 'invalid array length');

read_data.append(array_len.into());

for i in 0
..array_len {
read_layout(model, combine_key(key, i.into()), ref read_data, item_layout);
Expand Down Expand Up @@ -477,19 +443,14 @@ pub fn read_byte_array_layout(model: felt252, key: felt252, ref read_data: Array
pub fn read_struct_layout(
model: felt252, key: felt252, ref read_data: Array<felt252>, layout: Span<FieldLayout>
) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let field_key = combine_key(key, field_layout.selector);

read_layout(model, field_key, ref read_data, field_layout.layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let field_key = combine_key(key, field_layout.selector);

i += 1;
}
read_layout(model, field_key, ref read_data, field_layout.layout);
};
}

/// Read a tuple layout model record.
Expand All @@ -502,18 +463,14 @@ pub fn read_struct_layout(
pub fn read_tuple_layout(
model: felt252, key: felt252, ref read_data: Array<felt252>, layout: Span<Layout>
) {
let mut i = 0;
loop {
if i >= layout.len() {
break;
}

let field_layout = *layout.at(i);
let field_key = combine_key(key, i.into());
read_layout(model, field_key, ref read_data, field_layout);
for i in 0
..layout
.len() {
let field_layout = *layout.at(i);
let field_key = combine_key(key, i.into());

i += 1;
};
read_layout(model, field_key, ref read_data, field_layout);
};
}

pub fn read_enum_layout(
Expand Down
Loading