123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- /*
- Copyright 2014 The Kubernetes Authors.
- 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 runtime
- import (
- "errors"
- "k8s.io/apimachinery/pkg/conversion"
- "k8s.io/apimachinery/pkg/runtime/schema"
- )
- type encodable struct {
- E Encoder `json:"-"`
- obj Object
- versions []schema.GroupVersion
- }
- func (e encodable) GetObjectKind() schema.ObjectKind { return e.obj.GetObjectKind() }
- func (e encodable) DeepCopyObject() Object {
- var out encodable = e
- out.obj = e.obj.DeepCopyObject()
- copy(out.versions, e.versions)
- return out
- }
- // NewEncodable creates an object that will be encoded with the provided codec on demand.
- // Provided as a convenience for test cases dealing with internal objects.
- func NewEncodable(e Encoder, obj Object, versions ...schema.GroupVersion) Object {
- if _, ok := obj.(*Unknown); ok {
- return obj
- }
- return encodable{e, obj, versions}
- }
- func (re encodable) UnmarshalJSON(in []byte) error {
- return errors.New("runtime.encodable cannot be unmarshalled from JSON")
- }
- // Marshal may get called on pointers or values, so implement MarshalJSON on value.
- // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
- func (re encodable) MarshalJSON() ([]byte, error) {
- return Encode(re.E, re.obj)
- }
- // NewEncodableList creates an object that will be encoded with the provided codec on demand.
- // Provided as a convenience for test cases dealing with internal objects.
- func NewEncodableList(e Encoder, objects []Object, versions ...schema.GroupVersion) []Object {
- out := make([]Object, len(objects))
- for i := range objects {
- if _, ok := objects[i].(*Unknown); ok {
- out[i] = objects[i]
- continue
- }
- out[i] = NewEncodable(e, objects[i], versions...)
- }
- return out
- }
- func (re *Unknown) UnmarshalJSON(in []byte) error {
- if re == nil {
- return errors.New("runtime.Unknown: UnmarshalJSON on nil pointer")
- }
- re.TypeMeta = TypeMeta{}
- re.Raw = append(re.Raw[0:0], in...)
- re.ContentEncoding = ""
- re.ContentType = ContentTypeJSON
- return nil
- }
- // Marshal may get called on pointers or values, so implement MarshalJSON on value.
- // http://stackoverflow.com/questions/21390979/custom-marshaljson-never-gets-called-in-go
- func (re Unknown) MarshalJSON() ([]byte, error) {
- // If ContentType is unset, we assume this is JSON.
- if re.ContentType != "" && re.ContentType != ContentTypeJSON {
- return nil, errors.New("runtime.Unknown: MarshalJSON on non-json data")
- }
- if re.Raw == nil {
- return []byte("null"), nil
- }
- return re.Raw, nil
- }
- func Convert_runtime_Object_To_runtime_RawExtension(in *Object, out *RawExtension, s conversion.Scope) error {
- if in == nil {
- out.Raw = []byte("null")
- return nil
- }
- obj := *in
- if unk, ok := obj.(*Unknown); ok {
- if unk.Raw != nil {
- out.Raw = unk.Raw
- return nil
- }
- obj = out.Object
- }
- if obj == nil {
- out.Raw = nil
- return nil
- }
- out.Object = obj
- return nil
- }
- func Convert_runtime_RawExtension_To_runtime_Object(in *RawExtension, out *Object, s conversion.Scope) error {
- if in.Object != nil {
- *out = in.Object
- return nil
- }
- data := in.Raw
- if len(data) == 0 || (len(data) == 4 && string(data) == "null") {
- *out = nil
- return nil
- }
- *out = &Unknown{
- Raw: data,
- // TODO: Set ContentEncoding and ContentType appropriately.
- // Currently we set ContentTypeJSON to make tests passing.
- ContentType: ContentTypeJSON,
- }
- return nil
- }
- func DefaultEmbeddedConversions() []interface{} {
- return []interface{}{
- Convert_runtime_Object_To_runtime_RawExtension,
- Convert_runtime_RawExtension_To_runtime_Object,
- }
- }
|