Files
libopenapi/datamodel/high/v3/encoding.go
2024-08-26 20:42:40 +01:00

65 lines
2.5 KiB
Go

// Copyright 2022-2023 Princess B33f Heavy Industries / Dave Shanley
// SPDX-License-Identifier: MIT
package v3
import (
"github.com/pb33f/libopenapi/datamodel/high"
"github.com/pb33f/libopenapi/datamodel/low"
lowmodel "github.com/pb33f/libopenapi/datamodel/low"
lowv3 "github.com/pb33f/libopenapi/datamodel/low/v3"
"github.com/pb33f/libopenapi/orderedmap"
"gopkg.in/yaml.v3"
)
// Encoding represents an OpenAPI 3+ Encoding object
// - https://spec.openapis.org/oas/v3.1.0#encoding-object
type Encoding struct {
ContentType string `json:"contentType,omitempty" yaml:"contentType,omitempty"`
Headers *orderedmap.Map[string, *Header] `json:"headers,omitempty" yaml:"headers,omitempty"`
Style string `json:"style,omitempty" yaml:"style,omitempty"`
Explode *bool `json:"explode,omitempty" yaml:"explode,omitempty"`
AllowReserved bool `json:"allowReserved,omitempty" yaml:"allowReserved,omitempty"`
low *lowv3.Encoding
}
// NewEncoding creates a new instance of Encoding from a low-level one.
func NewEncoding(encoding *lowv3.Encoding) *Encoding {
e := new(Encoding)
e.low = encoding
e.ContentType = encoding.ContentType.Value
e.Style = encoding.Style.Value
if !encoding.Explode.IsEmpty() {
e.Explode = &encoding.Explode.Value
}
e.AllowReserved = encoding.AllowReserved.Value
e.Headers = ExtractHeaders(encoding.Headers.Value)
return e
}
// GoLow returns the low-level Encoding instance used to create the high-level one.
func (e *Encoding) GoLow() *lowv3.Encoding {
return e.low
}
// GoLowUntyped will return the low-level Encoding instance that was used to create the high-level one, with no type
func (e *Encoding) GoLowUntyped() any {
return e.low
}
// Render will return a YAML representation of the Encoding object as a byte slice.
func (e *Encoding) Render() ([]byte, error) {
return yaml.Marshal(e)
}
// MarshalYAML will create a ready to render YAML representation of the Encoding object.
func (e *Encoding) MarshalYAML() (interface{}, error) {
nb := high.NewNodeBuilder(e, e.low)
return nb.Render(), nil
}
// ExtractEncoding converts hard to navigate low-level plumbing Encoding definitions, into a high-level simple map
func ExtractEncoding(elements *orderedmap.Map[lowmodel.KeyReference[string], lowmodel.ValueReference[*lowv3.Encoding]]) *orderedmap.Map[string, *Encoding] {
return low.FromReferenceMapWithFunc(elements, NewEncoding)
}