# 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."
