blob: 4e4e4279f21f714b3828b15e9a0a985996528225 [file] [log] [blame] [edit]
# 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."