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

const uint16 MAX_KEY_LENGTH = 1024;
const uint16 MAX_VALUE_LENGTH = 16384;
const uint16 MAX_VALUE_COUNT = 256;
const uint16 MAX_CHILDREN_COUNT = 256;

union PropertyValue {
    1: string:MAX_VALUE_LENGTH str;
    2: vector<uint8>:MAX_VALUE_LENGTH bytes;
};

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

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

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

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

// The `Inspect` interface provides a point for Components to expose
// structured Objects for inspection. An Object may have 0 or more children.
[Discoverable]
protocol Inspect {
    ReadData() -> (Object object);
    ListChildren() -> (vector<string:MAX_KEY_LENGTH>:MAX_CHILDREN_COUNT children_names);
    // Open a child of this Object by name.
    // The name should match what is returned by ListChildren.
    OpenChild(string:MAX_KEY_LENGTH child_name, request<Inspect> child_channel) -> (bool success);
};
