Skip to content
Draft
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
1 change: 1 addition & 0 deletions sway-lib-std/src/lib.sw
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,4 @@ pub mod low_level_call;
pub mod array_conversions;
pub mod bytes_conversions;
pub mod clone;
pub mod trivial;
86 changes: 86 additions & 0 deletions sway-lib-std/src/trivial.sw
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
library;

use ::codec::{AbiDecode, AbiEncode, Buffer, BufferReader};
use ::marker::Enum;

pub struct TrivialBool {
value: u8,
}

impl TrivialBool {
pub fn unwrap(self) -> bool {
match self.value {
0 => false,
1 => true,
_ => __revert(0),
}
}
}

impl AbiEncode for TrivialBool {
// fn is_encode_trivial() -> bool {
// true
// }

fn abi_encode(self, buffer: Buffer) -> Buffer {
self.value.abi_encode(buffer)
}
}

impl AbiDecode for TrivialBool {
// fn is_decode_trivial() -> bool {
// true
// }

fn abi_decode(ref mut buffer: BufferReader) -> TrivialBool {
let value: u8 = buffer.read::<u8>();
TrivialBool { value }
}
}

pub struct TrivialEnum<T>
where
T: Enum + AbiEncode + AbiDecode,
{
value: T,
}

impl<T> TrivialEnum<T>
where
T: Enum + AbiEncode + AbiDecode,
{
pub fn unwrap(self) -> T {
// this is not useless, as an invalid
// discriminant will revert
match self.value {
v => v,
}
}
}

impl<T> AbiEncode for TrivialEnum<T>
where
T: Enum + AbiEncode + AbiDecode,
{
// fn is_encode_trivial() -> bool {
// true
// }

fn abi_encode(self, buffer: Buffer) -> Buffer {
self.value.abi_encode(buffer)
}
}

impl<T> AbiDecode for TrivialEnum<T>
where
T: Enum + AbiEncode + AbiDecode,
{
// fn is_decode_trivial() -> bool {
// true
// }

fn abi_decode(ref mut buffer: BufferReader) -> TrivialEnum<T> {
let value: T = buffer.decode::<T>();
TrivialEnum { value }
}
}
Loading