0x2::dynamic_object_field
Similar to sui::dynamic_field
, this module allows for the access of dynamic fields. But
unlike, sui::dynamic_field
the values bound to these dynamic fields must be objects
themselves. This allows for the objects to still exist within in storage, which may be important
for external tools. The difference is otherwise not observable from within Move.
Wrapper
add
borrow
borrow_mut
remove
exists_
exists_with_type
id
internal_add
internal_borrow
internal_borrow_mut
internal_remove
internal_exists_with_type
use 0x1::option;
use 0x2::dynamic_field;
use 0x2::object;
Wrapper
struct Wrapper<Name> has copy, drop, store
name: Name
add
Adds a dynamic object field to the object object: &mut UID
at field specified by name: Name
.
Aborts with EFieldAlreadyExists
if the object already has that field with that name.
public fun add<Name: copy, drop, store, Value: store, key>(object: &mut object::UID, name: Name, value: Value)
public fun add<Name: copy + drop + store, Value: key + store>(
// we use &mut UID in several spots for access control
object: &mut UID,
name: Name,
value: Value,
) {
add_impl!(object, name, value)
}
borrow
Immutably borrows the object
s dynamic object field with the name specified by name: Name
.
Aborts with EFieldDoesNotExist
if the object does not have a field with that name.
Aborts with EFieldTypeMismatch
if the field exists, but the value object does not have the
specified type.
public fun borrow<Name: copy, drop, store, Value: store, key>(object: &object::UID, name: Name): &Value
public fun borrow<Name: copy + drop + store, Value: key + store>(object: &UID, name: Name): &Value {
borrow_impl!(object, name)
}
borrow_mut
Mutably borrows the object
s dynamic object field with the name specified by name: Name
.
Aborts with EFieldDoesNotExist
if the object does not have a field with that name.
Aborts with EFieldTypeMismatch
if the field exists, but the value object does not have the
specified type.
public fun borrow_mut<Name: copy, drop, store, Value: store, key>(object: &mut object::UID, name: Name): &mut Value
public fun borrow_mut<Name: copy + drop + store, Value: key + store>(
object: &mut UID,
name: Name,
): &mut Value {
borrow_mut_impl!(object, name)
}
remove
Removes the object
s dynamic object field with the name specified by name: Name
and returns
the bound object.
Aborts with EFieldDoesNotExist
if the object does not have a field with that name.
Aborts with EFieldTypeMismatch
if the field exists, but the value object does not have the
specified type.
public fun remove<Name: copy, drop, store, Value: store, key>(object: &mut object::UID, name: Name): Value
public fun remove<Name: copy + drop + store, Value: key + store>(
object: &mut UID,
name: Name,
): Value {
remove_impl!(object, name)
}
exists_
Returns true if and only if the object
has a dynamic object field with the name specified by
name: Name
.
public fun exists_<Name: copy, drop, store>(object: &object::UID, name: Name): bool
public fun exists_<Name: copy + drop + store>(object: &UID, name: Name): bool {
let key = Wrapper { name };
field::exists_with_type<Wrapper<Name>, ID>(object, key)
}
exists_with_type
Returns true if and only if the object
has a dynamic field with the name specified by
name: Name
with an assigned value of type Value
.
public fun exists_with_type<Name: copy, drop, store, Value: store, key>(object: &object::UID, name: Name): bool
public fun exists_with_type<Name: copy + drop + store, Value: key + store>(
object: &UID,
name: Name,
): bool {
exists_with_type_impl!<_, Value>(object, name)
}
id
Returns the ID of the object associated with the dynamic object field Returns none otherwise
public fun id<Name: copy, drop, store>(object: &object::UID, name: Name): option::Option<object::ID>
public fun id<Name: copy + drop + store>(object: &UID, name: Name): Option<ID> {
let key = Wrapper { name };
if (!field::exists_with_type<Wrapper<Name>, ID>(object, key)) return option::none();
let (_field, value_addr) = field::field_info<Wrapper<Name>>(object, key);
option::some(value_addr.to_id())
}
internal_add
public(friend) fun internal_add<Name: copy, drop, store, Value: key>(object: &mut object::UID, name: Name, value: Value)
public(package) fun internal_add<Name: copy + drop + store, Value: key>(
// we use &mut UID in several spots for access control
object: &mut UID,
name: Name,
value: Value,
) {
add_impl!(object, name, value)
}
internal_borrow
public(friend) fun internal_borrow<Name: copy, drop, store, Value: key>(object: &object::UID, name: Name): &Value
public(package) fun internal_borrow<Name: copy + drop + store, Value: key>(
object: &UID,
name: Name,
): &Value {
borrow_impl!(object, name)
}
internal_borrow_mut
public(friend) fun internal_borrow_mut<Name: copy, drop, store, Value: key>(object: &mut object::UID, name: Name): &mut Value
public(package) fun internal_borrow_mut<Name: copy + drop + store, Value: key>(
object: &mut UID,
name: Name,
): &mut Value {
borrow_mut_impl!(object, name)
}
internal_remove
public(friend) fun internal_remove<Name: copy, drop, store, Value: key>(object: &mut object::UID, name: Name): Value
public(package) fun internal_remove<Name: copy + drop + store, Value: key>(
object: &mut UID,
name: Name,
): Value {
remove_impl!(object, name)
}
internal_exists_with_type
public(friend) fun internal_exists_with_type<Name: copy, drop, store, Value: key>(object: &object::UID, name: Name): bool
public(package) fun internal_exists_with_type<Name: copy + drop + store, Value: key>(
object: &UID,
name: Name,
): bool {
exists_with_type_impl!<_, Value>(object, name)
}