# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import collections


# Message types.
ACK = 'ack'
ECHO = 'echo'
GET = 'get'
SHUTDOWN = 'shutdown'
STATUS = 'status'

# Message type for container pool communication.
Message = collections.namedtuple('Message', ['type', 'args'])


def ack():
    """Creates a message of type ACK.

    ACK messages are returned by the server to acknowledge receipt and confirm
    that requested operations have taken place.
    """
    return Message(ACK, {})


def echo(msg):
    """Creates an echo message.

    ECHO messages are mainly for testing.  They verify that the service is up
    and running.

    @param msg: An optional string that can be attached to the message.
    """
    return Message(ECHO, {'msg': msg})


def shutdown():
    """Creates a service shutdown message.

    SHUTDOWN messages cause the service to shut down.  See Service.stop().
    """
    return Message(SHUTDOWN, {})


def status():
    """Creates a status request message.

    STATUS messages cause the service to return a dictionary describing the
    current state of the container pool.
    """
    return Message(STATUS, {})


def get(id, timeout=0):
    """Creates a get container message.

    GET messages retrieve a running container from the container pool.

    @param id: A ContainerId to be assigned to the container.
    @param timeout: An optional timeout to wait for the container.
    """
    return Message(GET, {'id': id, 'timeout': timeout})