blob: 94a8e62a776e779df2118aa349464d0176b12390 [file] [log] [blame]
Scott Bakere7144bc2019-10-01 14:16:47 -07001// Copyright 2017 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package openapiextension_v1
16
17import (
18 "fmt"
19 "io/ioutil"
20 "os"
21
22 "github.com/golang/protobuf/proto"
23 "github.com/golang/protobuf/ptypes"
24)
25
26type documentHandler func(version string, extensionName string, document string)
27type extensionHandler func(name string, yamlInput string) (bool, proto.Message, error)
28
29func forInputYamlFromOpenapic(handler documentHandler) {
30 data, err := ioutil.ReadAll(os.Stdin)
31 if err != nil {
32 fmt.Println("File error:", err.Error())
33 os.Exit(1)
34 }
35 if len(data) == 0 {
36 fmt.Println("No input data.")
37 os.Exit(1)
38 }
39 request := &ExtensionHandlerRequest{}
40 err = proto.Unmarshal(data, request)
41 if err != nil {
42 fmt.Println("Input error:", err.Error())
43 os.Exit(1)
44 }
45 handler(request.Wrapper.Version, request.Wrapper.ExtensionName, request.Wrapper.Yaml)
46}
47
48// ProcessExtension calles the handler for a specified extension.
49func ProcessExtension(handleExtension extensionHandler) {
50 response := &ExtensionHandlerResponse{}
51 forInputYamlFromOpenapic(
52 func(version string, extensionName string, yamlInput string) {
53 var newObject proto.Message
54 var err error
55
56 handled, newObject, err := handleExtension(extensionName, yamlInput)
57 if !handled {
58 responseBytes, _ := proto.Marshal(response)
59 os.Stdout.Write(responseBytes)
60 os.Exit(0)
61 }
62
63 // If we reach here, then the extension is handled
64 response.Handled = true
65 if err != nil {
66 response.Error = append(response.Error, err.Error())
67 responseBytes, _ := proto.Marshal(response)
68 os.Stdout.Write(responseBytes)
69 os.Exit(0)
70 }
71 response.Value, err = ptypes.MarshalAny(newObject)
72 if err != nil {
73 response.Error = append(response.Error, err.Error())
74 responseBytes, _ := proto.Marshal(response)
75 os.Stdout.Write(responseBytes)
76 os.Exit(0)
77 }
78 })
79
80 responseBytes, _ := proto.Marshal(response)
81 os.Stdout.Write(responseBytes)
82}