diff --git a/sway-lib-std/src/lib.sw b/sway-lib-std/src/lib.sw index 59b3568290b..c78aec62721 100644 --- a/sway-lib-std/src/lib.sw +++ b/sway-lib-std/src/lib.sw @@ -57,3 +57,4 @@ pub mod low_level_call; pub mod array_conversions; pub mod bytes_conversions; pub mod clone; +pub mod trivial; diff --git a/sway-lib-std/src/trivial.sw b/sway-lib-std/src/trivial.sw new file mode 100644 index 00000000000..39b24c4aaca --- /dev/null +++ b/sway-lib-std/src/trivial.sw @@ -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::(); + TrivialBool { value } + } +} + +pub struct TrivialEnum +where + T: Enum + AbiEncode + AbiDecode, +{ + value: T, +} + +impl TrivialEnum +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 AbiEncode for TrivialEnum +where + T: Enum + AbiEncode + AbiDecode, +{ + // fn is_encode_trivial() -> bool { + // true + // } + + fn abi_encode(self, buffer: Buffer) -> Buffer { + self.value.abi_encode(buffer) + } +} + +impl AbiDecode for TrivialEnum +where + T: Enum + AbiEncode + AbiDecode, +{ + // fn is_decode_trivial() -> bool { + // true + // } + + fn abi_decode(ref mut buffer: BufferReader) -> TrivialEnum { + let value: T = buffer.decode::(); + TrivialEnum { value } + } +}