From fada5b36dd01bb2a6266f356cd48e8230ee3b290 Mon Sep 17 00:00:00 2001 From: Andrei Marinica Date: Wed, 12 Jun 2024 18:32:39 +0300 Subject: [PATCH] ManagedDecimal - SCDisplay, Display, Debug --- .../types/managed/wrapped/managed_decimal.rs | 33 +++++++++++++++++-- .../scenario/tests/managed_decimal_test.rs | 6 ++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/framework/base/src/types/managed/wrapped/managed_decimal.rs b/framework/base/src/types/managed/wrapped/managed_decimal.rs index fb31e80e58..2ca276ca9c 100644 --- a/framework/base/src/types/managed/wrapped/managed_decimal.rs +++ b/framework/base/src/types/managed/wrapped/managed_decimal.rs @@ -4,9 +4,11 @@ use crate::{ const_handles, use_raw_handle, BigFloatApiImpl, BigIntApiImpl, ManagedTypeApi, StaticVarApiImpl, }, + formatter::{FormatBuffer, FormatByteReceiver, SCDisplay}, types::{BigFloat, BigUint}, }; +use alloc::string::ToString; use multiversx_sc_codec::{ DecodeError, DecodeErrorHandler, EncodeErrorHandler, NestedDecode, NestedDecodeInput, NestedEncode, NestedEncodeOutput, TopDecode, TopDecodeInput, TopEncode, TopEncodeOutput, @@ -17,7 +19,7 @@ use core::{ ops::{Add, Deref, Div, Mul, Sub}, }; -use super::ManagedRef; +use super::{ManagedBufferCachedBuilder, ManagedRef}; fn scaling_factor( num_decimals: NumDecimals, @@ -71,7 +73,7 @@ impl Decimals for ConstDecimals { } } -#[derive(Debug, Clone)] +#[derive(Clone)] pub struct ManagedDecimal { data: BigUint, decimals: D, @@ -402,3 +404,30 @@ impl TypeAbi false } } +impl SCDisplay for ManagedDecimal { + fn fmt(&self, f: &mut F) { + let sf = self.decimals.scaling_factor(); + let temp = &self.data / sf.deref(); + temp.fmt(f); + f.append_bytes(b"."); + let temp = &self.data % sf.deref(); + temp.fmt(f); + } +} + +impl core::fmt::Display for ManagedDecimal { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + let mut result = ManagedBufferCachedBuilder::::new_from_slice(&[]); + result.append_display(self); + core::fmt::Display::fmt(&result.into_managed_buffer(), f) + } +} + +impl core::fmt::Debug for ManagedDecimal { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + f.debug_struct("ManagedDecimal") + .field("handle", &self.data.handle.clone()) + .field("number", &self.to_string()) + .finish() + } +} diff --git a/framework/scenario/tests/managed_decimal_test.rs b/framework/scenario/tests/managed_decimal_test.rs index ea862953e7..ec7d29fd9d 100644 --- a/framework/scenario/tests/managed_decimal_test.rs +++ b/framework/scenario/tests/managed_decimal_test.rs @@ -63,10 +63,8 @@ pub fn test_managed_decimal() { ); let float_1 = BigFloat::::from_frac(3i64, 2i64); - let fixed_float_1 = ManagedDecimal::>::from_big_float( - &float_1, - ConstDecimals::<1>, - ); + let fixed_float_1 = + ManagedDecimal::>::from_big_float(&float_1, ConstDecimals::<1>); let fixed_float_2 = ManagedDecimal::::from_big_float(&float_1, 1usize); assert_eq!(