|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- // Copyright 2017 Google LLC
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- // Package protostruct supports operations on the protocol buffer Struct message.
- package protostruct
-
- import (
- pb "github.com/golang/protobuf/ptypes/struct"
- )
-
- // DecodeToMap converts a pb.Struct to a map from strings to Go types.
- // DecodeToMap panics if s is invalid.
- func DecodeToMap(s *pb.Struct) map[string]interface{} {
- if s == nil {
- return nil
- }
- m := map[string]interface{}{}
- for k, v := range s.Fields {
- m[k] = decodeValue(v)
- }
- return m
- }
-
- func decodeValue(v *pb.Value) interface{} {
- switch k := v.Kind.(type) {
- case *pb.Value_NullValue:
- return nil
- case *pb.Value_NumberValue:
- return k.NumberValue
- case *pb.Value_StringValue:
- return k.StringValue
- case *pb.Value_BoolValue:
- return k.BoolValue
- case *pb.Value_StructValue:
- return DecodeToMap(k.StructValue)
- case *pb.Value_ListValue:
- s := make([]interface{}, len(k.ListValue.Values))
- for i, e := range k.ListValue.Values {
- s[i] = decodeValue(e)
- }
- return s
- default:
- panic("protostruct: unknown kind")
- }
- }
|