k8s.io/kube-openapi@v0.0.0-20240228011516-70dd3763d340/pkg/spec3/media_type.go (about)

     1  /*
     2  Copyright 2021 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package spec3
    18  
    19  import (
    20  	"encoding/json"
    21  
    22  	"github.com/go-openapi/swag"
    23  	"k8s.io/kube-openapi/pkg/internal"
    24  	jsonv2 "k8s.io/kube-openapi/pkg/internal/third_party/go-json-experiment/json"
    25  	"k8s.io/kube-openapi/pkg/validation/spec"
    26  )
    27  
    28  // MediaType a struct that allows you to specify content format, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#mediaTypeObject
    29  //
    30  // Note that this struct is actually a thin wrapper around MediaTypeProps to make it referable and extensible
    31  type MediaType struct {
    32  	MediaTypeProps
    33  	spec.VendorExtensible
    34  }
    35  
    36  // MarshalJSON is a custom marshal function that knows how to encode MediaType as JSON
    37  func (m *MediaType) MarshalJSON() ([]byte, error) {
    38  	if internal.UseOptimizedJSONMarshalingV3 {
    39  		return internal.DeterministicMarshal(m)
    40  	}
    41  	b1, err := json.Marshal(m.MediaTypeProps)
    42  	if err != nil {
    43  		return nil, err
    44  	}
    45  	b2, err := json.Marshal(m.VendorExtensible)
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	return swag.ConcatJSON(b1, b2), nil
    50  }
    51  
    52  func (e *MediaType) MarshalNextJSON(opts jsonv2.MarshalOptions, enc *jsonv2.Encoder) error {
    53  	var x struct {
    54  		MediaTypeProps mediaTypePropsOmitZero `json:",inline"`
    55  		spec.Extensions
    56  	}
    57  	x.Extensions = internal.SanitizeExtensions(e.Extensions)
    58  	x.MediaTypeProps = mediaTypePropsOmitZero(e.MediaTypeProps)
    59  	return opts.MarshalNext(enc, x)
    60  }
    61  
    62  func (m *MediaType) UnmarshalJSON(data []byte) error {
    63  	if internal.UseOptimizedJSONUnmarshalingV3 {
    64  		return jsonv2.Unmarshal(data, m)
    65  	}
    66  	if err := json.Unmarshal(data, &m.MediaTypeProps); err != nil {
    67  		return err
    68  	}
    69  	if err := json.Unmarshal(data, &m.VendorExtensible); err != nil {
    70  		return err
    71  	}
    72  	return nil
    73  }
    74  
    75  func (m *MediaType) UnmarshalNextJSON(opts jsonv2.UnmarshalOptions, dec *jsonv2.Decoder) error {
    76  	var x struct {
    77  		spec.Extensions
    78  		MediaTypeProps
    79  	}
    80  	if err := opts.UnmarshalNext(dec, &x); err != nil {
    81  		return err
    82  	}
    83  	m.Extensions = internal.SanitizeExtensions(x.Extensions)
    84  	m.MediaTypeProps = x.MediaTypeProps
    85  
    86  	return nil
    87  }
    88  
    89  // MediaTypeProps a struct that allows you to specify content format, more at https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#mediaTypeObject
    90  type MediaTypeProps struct {
    91  	// Schema holds the schema defining the type used for the media type
    92  	Schema *spec.Schema `json:"schema,omitempty"`
    93  	// Example of the media type
    94  	Example interface{} `json:"example,omitempty"`
    95  	// Examples of the media type. Each example object should match the media type and specific schema if present
    96  	Examples map[string]*Example `json:"examples,omitempty"`
    97  	// A map between a property name and its encoding information. The key, being the property name, MUST exist in the schema as a property. The encoding object SHALL only apply to requestBody objects when the media type is multipart or application/x-www-form-urlencoded
    98  	Encoding map[string]*Encoding `json:"encoding,omitempty"`
    99  }
   100  
   101  type mediaTypePropsOmitZero struct {
   102  	Schema   *spec.Schema         `json:"schema,omitzero"`
   103  	Example  interface{}          `json:"example,omitempty"`
   104  	Examples map[string]*Example  `json:"examples,omitempty"`
   105  	Encoding map[string]*Encoding `json:"encoding,omitempty"`
   106  }