blob: 3b558d6dc526159b9cf0a082113db1e651e8e615 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2017 the original author or 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.
#
import sys
from google.protobuf.compiler import plugin_pb2 as plugin
from simplejson import dumps
# without this import, http method annotations would not be recognized:
from chameleon.protos import annotations_pb2, http_pb2
from chameleon.protoc_plugins.descriptor_parser import DescriptorParser
from swagger_template import native_descriptors_to_swagger
def generate_code(request, response):
assert isinstance(request, plugin.CodeGeneratorRequest)
parser = DescriptorParser()
native_data = parser.parse_file_descriptors(request.proto_file,
type_tag_name='_type',
fold_comments=True)
swagger = native_descriptors_to_swagger(native_data)
# generate the native decoded schema as json
# f = response.file.add()
# f.name = proto_file.name.replace('.proto', '.native.json')
# f.content = dumps(data)
# generate the real swagger.json file
f = response.file.add()
f.name = 'swagger.json'
f.content = dumps(swagger)
if __name__ == '__main__':
if len(sys.argv) >= 2:
# read input from file, to allow troubleshooting
with open(sys.argv[1], 'r') as f:
data = f.read()
else:
# read input from stdin
data = sys.stdin.read()
# parse request
request = plugin.CodeGeneratorRequest()
request.ParseFromString(data)
# create response object
response = plugin.CodeGeneratorResponse()
# generate the output and the response
generate_code(request, response)
# serialize the response
output = response.SerializeToString()
# write response to stdout
sys.stdout.write(output)