@@ -3,7 +3,10 @@ package valueparser
33import (
44 "encoding"
55 "fmt"
6+ "net/http"
67 "reflect"
8+
9+ "github.com/YaCodeDev/GoYaCodeDevUtils/yaerrors"
710)
811
912// TryUnmarshal is a generic function that converts a string value to the specified type T.
@@ -16,32 +19,63 @@ import (
1619// if err != nil {
1720// // Handle error
1821// }
19- func TryUnmarshal [T ParsableType ](value string , valueType reflect.Type ) (T , error ) {
22+ func TryUnmarshal [T ParsableType ](value string , valueType reflect.Type ) (T , yaerrors. Error ) {
2023 var zero T
2124
2225 typ := reflect .TypeOf (zero )
2326 ptr := reflect .New (valueType )
2427
2528 if unmarshaler , ok := ptr .Interface ().(encoding.TextUnmarshaler ); ok {
2629 if err := unmarshaler .UnmarshalText ([]byte (value )); err != nil {
27- return zero , fmt .Errorf ("cannot convert value %v to type %s: %w" , value , typ , err )
30+ return zero , yaerrors .FromError (
31+ http .StatusInternalServerError ,
32+ err ,
33+ fmt .Sprintf (
34+ "try unmarshal: cannot convert value %v to type %s" ,
35+ value ,
36+ typ ,
37+ ),
38+ )
2839 }
2940 } else if unmarshaler , ok := ptr .Interface ().(Unmarshalable ); ok {
3041 if err := unmarshaler .Unmarshal (value ); err != nil {
31- return zero , ErrUnparsableValue
42+ return zero , yaerrors .FromError (
43+ http .StatusInternalServerError ,
44+ ErrUnparsableValue ,
45+ fmt .Sprintf (
46+ "try unmarshal: %v cannot be unmarshaled to type %s: %v" ,
47+ value ,
48+ typ ,
49+ err ,
50+ ),
51+ )
3252 }
3353 } else {
34- return zero , ErrUnparsableValue
54+ return zero , yaerrors .FromError (
55+ http .StatusInternalServerError ,
56+ ErrUnparsableValue ,
57+ "try unmarshal: Unmarshalable interface not implemented" ,
58+ )
3559 }
3660
3761 val , err := ConvertValue (ptr .Elem (), typ )
3862 if err != nil {
39- return zero , fmt .Errorf ("cannot convert value %v to type %s: %w" , value , typ , err )
63+ return zero , err .Wrap (
64+ fmt .Sprintf (
65+ "try unmarshal: cannot convert value %v to type %s" ,
66+ value ,
67+ typ ,
68+ ),
69+ )
4070 }
4171
4272 if val , ok := val .Interface ().(T ); ok {
4373 return val , nil
4474 }
4575
46- return zero , ErrInvalidValue
76+ return zero , yaerrors .FromError (
77+ http .StatusInternalServerError ,
78+ ErrInvalidValue ,
79+ "try unmarshal" ,
80+ )
4781}
0 commit comments