// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.modular;

using fuchsia.sys;
using zx;

/// Provided to all component instances in their incoming namespace.
@discoverable
closed protocol ComponentContext {
    /// DEPRECATED: use the component's incoming namespace (for C++, see sys.ComponentContext)
    /// to connect to services provided by agents. See
    /// /docs/concepts/modular/guide/how_to_write_an_agent_cc.md for an example.
    ///
    /// Used to start an agent in the user scope if it isn't already running, and
    /// connect to it.
    strict DeprecatedConnectToAgent(resource struct {
        url string:MAX;
        incoming_services server_end:fuchsia.sys.ServiceProvider;
        controller server_end:AgentController;
    });

    /// DEPRECATED: use the component's incoming namespace (for C++, see sys.ComponentContext)
    /// to connect to services provided by agents. See
    /// /docs/concepts/modular/guide/how_to_write_an_agent_cc.md for an example.
    ///
    /// Connects to an agent that provides the given `request.service_name`, and
    /// then connects the given `request.channel` to that service.
    ///
    /// If an error is encountered, the `request.channel` will be closed with
    /// a status code, such as:
    ///   * `ZX_ERR_NOT_FOUND` -- if a `request.handler` agent URL is not
    ///     specified, and an agent for the `request.service_name` is not found
    ///   * `ZX_ERR_PEER_CLOSED` -- if `request.service_name` is not available from
    ///     the agent (either specified or discovered)
    strict DeprecatedConnectToAgentService(resource struct {
        request AgentServiceRequest;
    });
};

/// Used by ComponentContext.ConnectToAgentService
type AgentServiceRequest = resource table {
    /// The name of the requested service.
    1: service_name string:MAX;

    /// The channel that will be used to communicate with the requested service.
    2: channel zx.Handle:CHANNEL;

    /// The component URL of the Agent that is to provide the specified service.
    /// If no handler is specified, the framework will perform resolution to
    /// find an appropriate handler.
    3: handler fuchsia.sys.component_url;

    /// The AgentController handle is optional. If provided, the channel
    /// will be kept open until the agent providing `service_name` is terminated.
    4: agent_controller server_end:AgentController;
};
