Skip to content

Commit

Permalink
snapshots
Browse files Browse the repository at this point in the history
  • Loading branch information
damirka committed Feb 3, 2025
1 parent c847642 commit 4c06829
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 7 deletions.
41 changes: 41 additions & 0 deletions crates/sui-framework/docs/sui/bcs.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ let leftovers = prepared.into_remainder_bytes();
- [Function `peel_vec_u64`](#sui_bcs_peel_vec_u64)
- [Function `peel_vec_u128`](#sui_bcs_peel_vec_u128)
- [Function `peel_vec_u256`](#sui_bcs_peel_vec_u256)
- [Function `peel_enum_tag`](#sui_bcs_peel_enum_tag)
- [Macro function `peel_option`](#sui_bcs_peel_option)
- [Function `peel_option_address`](#sui_bcs_peel_option_address)
- [Function `peel_option_bool`](#sui_bcs_peel_option_bool)
Expand Down Expand Up @@ -766,6 +767,46 @@ Peel a vector of <code>u256</code> from serialized bytes.



</details>

<a name="sui_bcs_peel_enum_tag"></a>

## Function `peel_enum_tag`

Peel enum from serialized bytes, where <code>$f</code> takes a <code>tag</code> value and returns
the corresponding enum variant. Move enums are limited to 127 variants,
however the tag can be any <code>u64</code> value.

Example:
```rust
let my_enum = match (bcs.peel_enum_tag()) {
0 => Enum::Empty,
1 => Enum::U8(bcs.peel_u8()),
2 => Enum::U16(bcs.peel_u16()),
3 => Enum::Struct { a: bcs.peel_address(), b: bcs.peel_u8() },
_ => abort,
};
```


<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs.md#sui_bcs_peel_enum_tag">peel_enum_tag</a>(<a href="../sui/bcs.md#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs.md#sui_bcs_BCS">sui::bcs::BCS</a>): u32
</code></pre>



<details>
<summary>Implementation</summary>


<pre><code><b>public</b> <b>fun</b> <a href="../sui/bcs.md#sui_bcs_peel_enum_tag">peel_enum_tag</a>(<a href="../sui/bcs.md#sui_bcs">bcs</a>: &<b>mut</b> <a href="../sui/bcs.md#sui_bcs_BCS">BCS</a>): u32 {
<b>let</b> tag = <a href="../sui/bcs.md#sui_bcs">bcs</a>.<a href="../sui/bcs.md#sui_bcs_peel_vec_length">peel_vec_length</a>();
<b>assert</b>!(tag &lt;= <a href="../std/u32.md#std_u32_max_value">std::u32::max_value</a>!() <b>as</b> u64, <a href="../sui/bcs.md#sui_bcs_EOutOfRange">EOutOfRange</a>);
tag <b>as</b> u32
}
</code></pre>



</details>

<a name="sui_bcs_peel_option"></a>
Expand Down
13 changes: 8 additions & 5 deletions crates/sui-framework/packages/sui-framework/sources/bcs.move
Original file line number Diff line number Diff line change
Expand Up @@ -224,16 +224,19 @@ public fun peel_vec_u256(bcs: &mut BCS): vector<u256> {
/// however the tag can be any `u64` value.
///
/// Example:
/// ```
/// bcs.peel_enum!(|tag| match (tag) {
/// ```rust
/// let my_enum = match (bcs.peel_enum_tag()) {
/// 0 => Enum::Empty,
/// 1 => Enum::U8(bcs.peel_u8()),
/// 2 => Enum::U16(bcs.peel_u16()),
/// 3 => Enum::Struct { a: bcs.peel_address(), b: bcs.peel_u8() },
/// _ => abort,
/// });
/// };
/// ```
public macro fun peel_enum<$T>($bcs: &mut BCS, $f: |u64| -> $T): $T {
$f(peel_vec_length($bcs))
public fun peel_enum_tag(bcs: &mut BCS): u32 {
let tag = bcs.peel_vec_length();
assert!(tag <= std::u32::max_value!() as u64, EOutOfRange);
tag as u32
}

// === Option<T> ===
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,12 +196,12 @@ module sui::bcs_tests {

use fun peel_test_enum as BCS.peel_test_enum;
fun peel_test_enum(bytes: &mut BCS): Enum {
bytes.peel_enum!(|tag| match (tag) {
match (bytes.peel_enum_tag()) {
0 => Enum::Empty,
1 => Enum::U8(bytes.peel_u8()),
2 => Enum::U16(bytes.peel_u16()),
_ => abort,
})
}
}

#[test]
Expand Down
Binary file modified crates/sui-framework/packages_compiled/sui-framework
Binary file not shown.
3 changes: 3 additions & 0 deletions crates/sui-framework/published_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1507,6 +1507,9 @@ peel_vec_u128
peel_vec_u256
public fun
0x2::bcs
peel_enum_tag
public fun
0x2::bcs
peel_option_address
public fun
0x2::bcs
Expand Down

0 comments on commit 4c06829

Please sign in to comment.