// 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;

[Discoverable]
protocol ContextDebug {
    // The watch will stay active until the |listener| handle is closed.
    Watch(ContextDebugListener listener);

    // Waits until Context Engine has reached a steady state such that no further
    // activity will occur unless acted upon from the outside.
    WaitUntilIdle() -> ();
};

protocol ContextDebugListener {
    // Called any time a value is added, updated or removed. Each element in
    // |values| represents a single add, update or remove operation.  Values are
    // guaranteed to appear before their children in the case that a parent and
    // its child are included in the same update.
    OnValuesChanged(vector<ContextDebugValue> values);

    OnSubscriptionsChanged(vector<ContextDebugSubscription> subscription);
};

// Represents a single update to a value. If |value| is omitted, the value with
// |id| was deleted.
struct ContextDebugValue {
    vector<string> parent_ids;
    string id;
    ContextValue? value;
};

struct ContextDebugSubscription {
    string id;

    // These are null when describing a subscription that was removed, although
    // it's safe to condition only on |query|.
    SubscriptionDebugInfo? debug_info;
    ContextQuery? query;
};

struct SubscriptionDebugInfo {
    ComponentScope client_info;
};
