2025-09-04 17:22:28 +05:30
package binding
import (
"encoding/json"
"io"
"github.com/SigNoz/signoz/pkg/errors"
)
2025-09-05 21:17:19 +05:30
const (
ErrMessageInvalidJSON string = "request body contains invalid JSON, please verify the format and try again."
ErrMessageInvalidField string = "request body contains invalid field value"
)
2025-09-04 17:22:28 +05:30
var _ Binding = ( * jsonBinding ) ( nil )
type jsonBinding struct { }
func ( b * jsonBinding ) BindBody ( body io . Reader , obj any , opts ... BindBodyOption ) error {
bindBodyOptions := & bindBodyOptions {
DisallowUnknownFields : false ,
UseNumber : false ,
}
for _ , opt := range opts {
opt ( bindBodyOptions )
}
decoder := json . NewDecoder ( body )
if bindBodyOptions . DisallowUnknownFields {
decoder . DisallowUnknownFields ( )
}
if bindBodyOptions . UseNumber {
decoder . UseNumber ( )
}
if err := decoder . Decode ( obj ) ; err != nil {
2025-09-05 21:17:19 +05:30
var syntaxError * json . SyntaxError
var unmarshalError * json . InvalidUnmarshalError
var unmarshalTypeError * json . UnmarshalTypeError
if errors . As ( err , & syntaxError ) || errors . As ( err , & unmarshalError ) || errors . Is ( err , io . EOF ) || errors . Is ( err , io . ErrUnexpectedEOF ) {
return errors .
New ( errors . TypeInvalidInput , ErrCodeInvalidRequestBody , ErrMessageInvalidJSON ) .
WithAdditional ( err . Error ( ) )
}
if errors . As ( err , & unmarshalTypeError ) {
if unmarshalTypeError . Field != "" {
return errors .
New ( errors . TypeInvalidInput , ErrCodeInvalidRequestField , ErrMessageInvalidField ) .
WithAdditional ( "value of type '" + unmarshalTypeError . Value + "' was received for field '" + unmarshalTypeError . Field + "', try sending '" + unmarshalTypeError . Type . String ( ) + "' instead?" )
}
return errors .
New ( errors . TypeInvalidInput , ErrCodeInvalidRequestField , ErrMessageInvalidField ) .
WithAdditional ( "value of type '" + unmarshalTypeError . Value + "' was received, try sending '" + unmarshalTypeError . Type . String ( ) + "' instead?" )
}
return err
2025-09-04 17:22:28 +05:30
}
return nil
}