// Copyright 2018 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.
// DEPRECATED: This library is being replaced. Do not add new dependencies
// to this interface.

library fuchsia.inspect.deprecated;

type PropertyValue = strict union {
    1: str string:MAX;
    2: bytes vector<uint8>:MAX;
};

// A string property on an `Object`. Consisting of a key and value.
type Property = struct {
    key string:MAX;
    value PropertyValue;
};

// The value of a metric is one of these numeric types.
type MetricValue = strict union {
    1: int_value int64;
    2: uint_value uint64;
    3: double_value float64;
};

// A Metric is a string key and the associated numeric value.
type Metric = struct {
    key string:MAX;
    value MetricValue;
};

// An `Object` has a name and 0 or more properties and metrics.
type Object = struct {
    name string:MAX;
    properties vector<Property>:MAX;
    metrics vector<Metric>:MAX;
};

// The `Inspect` interface provides a point for Components to expose
// structured Objects for inspection. An Object may have 0 or more children.
@discoverable
closed protocol Inspect {
    strict ReadData() -> (struct {
        object Object;
    });
    strict ListChildren() -> (struct {
        children_names vector<string:MAX>:MAX;
    });
    // Open a child of this Object by name.
    // The name should match what is returned by ListChildren.
    strict OpenChild(resource struct {
        child_name string:MAX;
        child_channel server_end:Inspect;
    }) -> (struct {
        success bool;
    });
};
