// Copyright 2020 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.testing.sl4f;

using zx;

/// Implemented by a backend component hosting one or more facades. Used to acquire the list of
/// facades hosted by a `FacadeProvider` instance.
protocol FacadeIterator {
    GetNext() -> (vector<string:MAX>:MAX facades);
};

/// Implemented by a backend component hosting one or more facades. A facade must only be hosted by
/// a signel `FacadeProvider` instance.
/// NOTE: The current implementation uses ComponentsV1 and only supports a single `FacadeProvider`
/// instance. This is intended to change and may result in changes to the protocol.
[Discoverable]
protocol FacadeProvider {
    /// Connect to a `FacadeIterator` to obtain the list of facades hosted by this `FacadeProvider`.
    GetFacades(request<FacadeIterator> iterator);

    /// Executes ‘command’ on ‘facade’. Returns an optional result JSON blob and error string.
    Execute(string:MAX facade, string:MAX command, zx.handle:VMO params_blob)
        -> (zx.handle:VMO? result_blob, string:MAX? error);

    /// Cleans up any resources and transient state associated with SL4F facades hosted by this
    /// `FacadeProvider`. Returns on completion.
    Cleanup() -> ();

    /// Prints the state of all facades hosted by this `FacadeProvider`. Returns on completion.
    Print() -> ();
};
