@@ -3,10 +3,15 @@ package fpgo
33import (
44 "errors"
55 "fmt"
6+ "math"
67 "reflect"
78 "strconv"
89)
910
11+ var (
12+ ErrConversionSizeOverflow = errors .New ("size overflow" )
13+ )
14+
1015// MaybeDef Maybe inspired by Rx/Optional/Guava/Haskell
1116type MaybeDef struct {
1217 ref interface {}
@@ -184,23 +189,35 @@ func (maybeSelf MaybeDef) ToInt() (int, error) {
184189 case bool :
185190 val , err := maybeSelf .ToBool ()
186191 if val {
187- return int ( 1 ) , err
192+ return 1 , err
188193 }
189- return int ( 0 ) , err
194+ return 0 , err
190195 case int :
191196 return (ref ).(int ), nil
192197 case int32 :
193198 val , err := maybeSelf .ToInt32 ()
199+ if val > math .MaxInt32 {
200+ return 0 , ErrConversionSizeOverflow
201+ }
194202 return int (val ), err
195203 case int64 :
196204 val , err := maybeSelf .ToInt64 ()
205+ if val > math .MaxInt32 {
206+ return 0 , ErrConversionSizeOverflow
207+ }
197208 return int (val ), err
198209 case float32 :
199210 val , err := maybeSelf .ToFloat32 ()
200- return int (val ), err
211+ if val > math .MaxInt32 {
212+ return 0 , ErrConversionSizeOverflow
213+ }
214+ return int (math .Round (float64 (val ))), err
201215 case float64 :
202216 val , err := maybeSelf .ToFloat64 ()
203- return int (val ), err
217+ if val > math .MaxInt32 {
218+ return 0 , ErrConversionSizeOverflow
219+ }
220+ return int (math .Round (val )), err
204221 }
205222}
206223
@@ -230,13 +247,19 @@ func (maybeSelf MaybeDef) ToInt32() (int32, error) {
230247 return (ref ).(int32 ), nil
231248 case int64 :
232249 val , err := maybeSelf .ToInt64 ()
250+ if val > math .MaxInt32 {
251+ return 0 , ErrConversionSizeOverflow
252+ }
233253 return int32 (val ), err
234254 case float32 :
235255 val , err := maybeSelf .ToFloat32 ()
236- return int32 (val ), err
256+ if val > math .MaxInt32 {
257+ return 0 , ErrConversionSizeOverflow
258+ }
259+ return int32 (math .Round (float64 (val ))), err
237260 case float64 :
238261 val , err := maybeSelf .ToFloat64 ()
239- return int32 (val ), err
262+ return int32 (math . Round ( val ) ), err
240263 }
241264}
242265
@@ -268,10 +291,16 @@ func (maybeSelf MaybeDef) ToInt64() (int64, error) {
268291 return (ref ).(int64 ), nil
269292 case float32 :
270293 val , err := maybeSelf .ToFloat32 ()
271- return int64 (val ), err
294+ if val > math .MaxInt64 {
295+ return 0 , ErrConversionSizeOverflow
296+ }
297+ return int64 (math .Round (float64 (val ))), err
272298 case float64 :
273299 val , err := maybeSelf .ToFloat64 ()
274- return int64 (val ), err
300+ if val > math .MaxInt64 {
301+ return 0 , ErrConversionSizeOverflow
302+ }
303+ return int64 (math .Round (val )), err
275304 }
276305}
277306
0 commit comments