28
vendor/github.com/gogo/protobuf/jsonpb/jsonpb.go
generated
vendored
28
vendor/github.com/gogo/protobuf/jsonpb/jsonpb.go
generated
vendored
@@ -56,6 +56,7 @@ import (
|
||||
)
|
||||
|
||||
const secondInNanos = int64(time.Second / time.Nanosecond)
|
||||
const maxSecondsInDuration = 315576000000
|
||||
|
||||
// Marshaler is a configurable object for converting between
|
||||
// protocol buffer objects and a JSON representation for them.
|
||||
@@ -163,6 +164,11 @@ type isWkt interface {
|
||||
XXX_WellKnownType() string
|
||||
}
|
||||
|
||||
var (
|
||||
wktType = reflect.TypeOf((*isWkt)(nil)).Elem()
|
||||
messageType = reflect.TypeOf((*proto.Message)(nil)).Elem()
|
||||
)
|
||||
|
||||
// marshalObject writes a struct to the Writer.
|
||||
func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error {
|
||||
if jsm, ok := v.(JSONPBMarshaler); ok {
|
||||
@@ -210,19 +216,26 @@ func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeU
|
||||
// Any is a bit more involved.
|
||||
return m.marshalAny(out, v, indent)
|
||||
case "Duration":
|
||||
// "Generated output always contains 0, 3, 6, or 9 fractional digits,
|
||||
// depending on required precision."
|
||||
s, ns := s.Field(0).Int(), s.Field(1).Int()
|
||||
if s < -maxSecondsInDuration || s > maxSecondsInDuration {
|
||||
return fmt.Errorf("seconds out of range %v", s)
|
||||
}
|
||||
if ns <= -secondInNanos || ns >= secondInNanos {
|
||||
return fmt.Errorf("ns out of range (%v, %v)", -secondInNanos, secondInNanos)
|
||||
}
|
||||
if (s > 0 && ns < 0) || (s < 0 && ns > 0) {
|
||||
return errors.New("signs of seconds and nanos do not match")
|
||||
}
|
||||
if s < 0 {
|
||||
// Generated output always contains 0, 3, 6, or 9 fractional digits,
|
||||
// depending on required precision, followed by the suffix "s".
|
||||
f := "%d.%09d"
|
||||
if ns < 0 {
|
||||
ns = -ns
|
||||
if s == 0 {
|
||||
f = "-%d.%09d"
|
||||
}
|
||||
}
|
||||
x := fmt.Sprintf("%d.%09d", s, ns)
|
||||
x := fmt.Sprintf(f, s, ns)
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, "000")
|
||||
x = strings.TrimSuffix(x, ".000")
|
||||
@@ -543,7 +556,8 @@ func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v refle
|
||||
|
||||
// Handle well-known types.
|
||||
// Most are handled up in marshalObject (because 99% are messages).
|
||||
if wkt, ok := v.Interface().(isWkt); ok {
|
||||
if v.Type().Implements(wktType) {
|
||||
wkt := v.Interface().(isWkt)
|
||||
switch wkt.XXX_WellKnownType() {
|
||||
case "NullValue":
|
||||
out.write("null")
|
||||
@@ -1414,8 +1428,8 @@ func checkRequiredFields(pb proto.Message) error {
|
||||
}
|
||||
|
||||
func checkRequiredFieldsInValue(v reflect.Value) error {
|
||||
if pm, ok := v.Interface().(proto.Message); ok {
|
||||
return checkRequiredFields(pm)
|
||||
if v.Type().Implements(messageType) {
|
||||
return checkRequiredFields(v.Interface().(proto.Message))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user