diff options
author | Bjørn Erik Pedersen <[email protected]> | 2020-06-30 16:11:05 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2020-07-06 20:03:36 +0200 |
commit | 12a65e76df9470d9563b91a22969ddb41b7c19aa (patch) | |
tree | ab7b7b3cc67fbb9b4a86c1c347081e4e959ed8e8 /tpl/openapi | |
parent | 58c0f5e6171cbf8e3ed8d73ac95a7b85168c5b2f (diff) | |
download | hugo-12a65e76df9470d9563b91a22969ddb41b7c19aa.tar.gz hugo-12a65e76df9470d9563b91a22969ddb41b7c19aa.zip |
Add openapi3.Unmarshal
Fixes #7442
Fixes #7443
Diffstat (limited to 'tpl/openapi')
-rw-r--r-- | tpl/openapi/openapi3/init.go | 42 | ||||
-rw-r--r-- | tpl/openapi/openapi3/openapi3.go | 97 |
2 files changed, 139 insertions, 0 deletions
diff --git a/tpl/openapi/openapi3/init.go b/tpl/openapi/openapi3/init.go new file mode 100644 index 000000000..1e1a4ae05 --- /dev/null +++ b/tpl/openapi/openapi3/init.go @@ -0,0 +1,42 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// 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 openapi3 + +import ( + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/tpl/internal" +) + +const name = "openapi3" + +func init() { + f := func(d *deps.Deps) *internal.TemplateFuncsNamespace { + ctx := New(d) + + ns := &internal.TemplateFuncsNamespace{ + Name: name, + Context: func(args ...interface{}) interface{} { return ctx }, + } + + ns.AddMethodMapping(ctx.Unmarshal, + nil, + [][2]string{}, + ) + + return ns + + } + + internal.AddTemplateFuncsNamespace(f) +} diff --git a/tpl/openapi/openapi3/openapi3.go b/tpl/openapi/openapi3/openapi3.go new file mode 100644 index 000000000..7dfd2f6a7 --- /dev/null +++ b/tpl/openapi/openapi3/openapi3.go @@ -0,0 +1,97 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// 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 openapi3 + +import ( + "io/ioutil" + + gyaml "github.com/ghodss/yaml" + + "github.com/pkg/errors" + + kopenapi3 "github.com/getkin/kin-openapi/openapi3" + "github.com/gohugoio/hugo/cache/namedmemcache" + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/parser/metadecoders" + "github.com/gohugoio/hugo/resources/resource" +) + +// New returns a new instance of the openapi3-namespaced template functions. +func New(deps *deps.Deps) *Namespace { + // TODO1 consolidate when merging that "other branch" -- but be aware of the keys. + cache := namedmemcache.New() + deps.BuildStartListeners.Add( + func() { + cache.Clear() + }) + + return &Namespace{ + cache: cache, + deps: deps, + } +} + +// Namespace provides template functions for the "openapi3". +type Namespace struct { + cache *namedmemcache.Cache + deps *deps.Deps +} + +func (ns *Namespace) Unmarshal(r resource.UnmarshableResource) (*kopenapi3.Swagger, error) { + + key := r.Key() + if key == "" { + return nil, errors.New("no Key set in Resource") + } + + v, err := ns.cache.GetOrCreate(key, func() (interface{}, error) { + f := metadecoders.FormatFromMediaType(r.MediaType()) + if f == "" { + return nil, errors.Errorf("MIME %q not supported", r.MediaType()) + } + + reader, err := r.ReadSeekCloser() + if err != nil { + return nil, err + } + defer reader.Close() + + b, err := ioutil.ReadAll(reader) + if err != nil { + return nil, err + } + + s := &kopenapi3.Swagger{} + switch f { + case metadecoders.YAML: + err = gyaml.Unmarshal(b, s) + default: + err = metadecoders.Default.UnmarshalTo(b, f, s) + } + if err != nil { + return nil, err + } + + err = kopenapi3.NewSwaggerLoader().ResolveRefsIn(s, nil) + + return s, err + }) + + if err != nil { + return nil, err + } + + return v.(*kopenapi3.Swagger), nil + +} |