func (s *Scheme) DecodeToVersionedObject(data []byte) (interface{}, string, string, error) { version, kind, err := s.DataVersionAndKind(data) if err != nil { return nil, "", "", err } gv, err := unversioned.ParseGroupVersion(version) if err != nil { return nil, "", "", err } internalGV, exists := s.InternalVersions[gv.Group] if !exists { return nil, "", "", fmt.Errorf("no internalVersion specified for %v", gv) } if len(gv.Version) == 0 && len(internalGV.Version) != 0 { return nil, "", "", fmt.Errorf("version not set in '%s'", string(data)) } if kind == "" { return nil, "", "", fmt.Errorf("kind not set in '%s'", string(data)) } obj, err := s.NewObject(version, kind) if err != nil { return nil, "", "", err } if err := codec.NewDecoderBytes(data, new(codec.JsonHandle)).Decode(obj); err != nil { return nil, "", "", err } return obj, version, kind, nil }
// DecodeIntoWithSpecifiedVersionKind compares the passed in requestGroupVersionKind // with data.Version and data.Kind, defaulting data.Version and // data.Kind to the specified value if they are empty, or generating an error if // data.Version and data.Kind are not empty and differ from the specified value. // The function then implements the functionality of DecodeInto. // If specifiedVersion and specifiedKind are empty, the function degenerates to // DecodeInto. func (s *Scheme) DecodeIntoWithSpecifiedVersionKind(data []byte, obj interface{}, requestedGVK unversioned.GroupVersionKind) error { if len(data) == 0 { return errors.New("empty input") } dataVersion, dataKind, err := s.DataVersionAndKind(data) if err != nil { return err } if dataVersion == "" { dataVersion = requestedGVK.GroupVersion().String() } if dataKind == "" { dataKind = requestedGVK.Kind } if (len(requestedGVK.Group) > 0 || len(requestedGVK.Version) > 0) && (dataVersion != requestedGVK.GroupVersion().String()) { return errors.New(fmt.Sprintf("The apiVersion in the data (%s) does not match the specified apiVersion(%v)", dataVersion, requestedGVK.GroupVersion())) } if len(requestedGVK.Kind) > 0 && (dataKind != requestedGVK.Kind) { return errors.New(fmt.Sprintf("The kind in the data (%s) does not match the specified kind(%v)", dataKind, requestedGVK)) } objVersion, objKind, err := s.ObjectVersionAndKind(obj) if err != nil { return err } if dataKind == "" { // Assume objects with unset Kind fields are being unmarshalled into the // correct type. dataKind = objKind } if dataVersion == "" { // Assume objects with unset Version fields are being unmarshalled into the // correct type. dataVersion = objVersion } external, err := s.NewObject(dataVersion, dataKind) if err != nil { return err } if err := codec.NewDecoderBytes(data, new(codec.JsonHandle)).Decode(external); err != nil { return err } flags, meta := s.generateConvertMeta(dataVersion, objVersion, external) if err := s.converter.Convert(external, obj, flags, meta); err != nil { return err } // Version and Kind should be blank in memory. return s.SetVersionAndKind("", "", obj) }