| # Copyright 2018 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """This file is heavily based off of LUCI encoding.py.""" |
| |
| from chromite.third_party.google.protobuf import json_format |
| from chromite.third_party.google.protobuf import text_format |
| |
| |
| class Encoding: |
| """Encoding enum-ish class.""" |
| |
| BINARY = (0, "application/prpc; encoding=binary") |
| JSON = (1, "application/json") |
| TEXT = (2, "application/prpc; encoding=text") |
| |
| @staticmethod |
| def media_type(encoding): |
| return encoding[1] |
| |
| |
| def get_decoder(encoding): |
| """Returns the appropriate decoder for content type. |
| |
| Args: |
| encoding: A value from the Encoding enum. |
| |
| Returns: |
| A callable which takes an encoded string and an empty protobuf message, |
| and populates the given protobuf with data from the string. Each decoder |
| may raise exceptions of its own based on incorrectly formatted data. |
| """ |
| if encoding == Encoding.BINARY: |
| return lambda string, proto: proto.ParseFromString(string) |
| elif encoding == Encoding.JSON: |
| return json_format.Parse |
| elif encoding == Encoding.TEXT: |
| return text_format.Merge |
| else: |
| assert ( |
| False |
| ), "Argument |encoding| was not a value of the Encoding enum." |
| |
| |
| def get_encoder(encoding): |
| """Returns the appropriate encoder for the Accept content type. |
| |
| Args: |
| encoding: A value from the Encoding enum. |
| |
| Returns: |
| A callable which takes an initialized protobuf message, and returns a |
| string representing its data. Each encoder may raise exceptions of its |
| own. |
| """ |
| if encoding == Encoding.BINARY: |
| return lambda proto: proto.SerializeToString() |
| elif encoding == Encoding.JSON: |
| return lambda proto: ")]}'\n" + json_format.MessageToJson(proto) |
| elif encoding == Encoding.TEXT: |
| return lambda proto: text_format.MessageToString(proto, as_utf8=True) |
| else: |
| assert ( |
| False |
| ), "Argument |encoding| was not a value of the Encoding enum." |