Skip to content

copyable_any - [mainnet]

use 0x1::bcs;
use 0x1::error;
use 0x1::from_bcs;
use 0x1::string;
use 0x1::type_info;

Constants

The type provided for unpack is not the same as was given for pack.

const ETYPE_MISMATCH: u64 = 0;

Structs

Any

The same as any::Any but with the copy ability.

struct Any has copy, drop, store
Fields
type_name: string::String
data: vector<u8>

Functions

pack

Pack a value into the Any representation. Because Any can be stored, dropped, and copied this is also required from T.

public fun pack<T: copy, drop, store>(x: T): copyable_any::Any
Implementation
public fun pack<T: drop + store + copy>(x: T): Any {
Any {
type_name: type_info::type_name<T>(),
data: bcs::to_bytes(&x)
}
}

unpack

Unpack a value from the Any representation. This aborts if the value has not the expected type T.

public fun unpack<T>(self: copyable_any::Any): T
Implementation
public fun unpack<T>(self: Any): T {
assert!(type_info::type_name<T>() == self.type_name, error::invalid_argument(ETYPE_MISMATCH));
from_bytes<T>(self.data)
}

type_name

Returns the type name of this Any

public fun type_name(self: &copyable_any::Any): &string::String
Implementation
public fun type_name(self: &Any): &String {
&self.type_name
}

Specification

pack

public fun pack<T: copy, drop, store>(x: T): copyable_any::Any
aborts_if false;
pragma opaque;
ensures result == Any {
type_name: type_info::type_name<T>(),
data: bcs::serialize<T>(x)
};
ensures [abstract] from_bcs::deserializable<T>(result.data);

unpack

public fun unpack<T>(self: copyable_any::Any): T
include UnpackAbortsIf<T>;
ensures result == from_bcs::deserialize<T>(self.data);
schema UnpackAbortsIf<T> {
self: Any;
aborts_if type_info::type_name<T>() != self.type_name;
aborts_if !from_bcs::deserializable<T>(self.data);
}

type_name

public fun type_name(self: &copyable_any::Any): &string::String
aborts_if false;
ensures result == self.type_name;