// Copyright 2019 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.
@available(added=7)
library fuchsia.inspect;
using fuchsia.mem;

/// Maximum length of an Inspect Tree, specified by the format.
const MAX_TREE_NAME_LENGTH uint64 = 2040;

/// Maximum number of children returned by a single read of the tree name iterator.
@available(removed=9)
const MAX_TREE_NAME_LIST_SIZE uint64 = 64;

alias TreeName = string:MAX_TREE_NAME_LENGTH;

/// The content of a specific Inspect Tree.
type TreeContent = resource table {
    /// Buffer containing the bytes of a tree in Inspect format.
    1: buffer fuchsia.mem.Buffer;
};

/// Iterator protocol for listing the names of children of a particular Tree.
closed(removed=25) open(added=25) protocol TreeNameIterator {
    /// Get the next batch of names.
    ///
    /// Returns an empty vector and closes the channel when no more names are present.
    /// Implementors may eagerly close the channel after sending the last batch.
    strict GetNext() -> (struct {
        name vector<TreeName>:MAX;
    });
};

/// The Tree protocol represents a hierarchy of Inspect VMOs.
///
/// Link values stored in an Inspect file contain references to new
/// named files that contain a continuation of the data for the overall
/// hierarchy. Protocol Tree allows clients to request these named files so
/// long as the hosting component is still alive.
///
/// Connecting to a particular tree keeps the content for that Tree resident
/// in memory. Clients are recommended to traverse the trees in depth-first
/// order to reduce memory usage. Serving components are free to deny
/// connections to avoid unbounded memory usage.
@discoverable(client="platform")
closed(removed=25) open(added=25) protocol Tree {
    /// Get the content for the Inspect VMO backing this tree.
    ///
    /// So long as the Tree connection is still maintained, the contents
    /// of the tree are guaranteed to still be live. Once the connection is
    /// lost, the serving component is free to clear the contents of returned
    /// shared buffers.
    ///
    /// Serving components may return different buffers to GetContent
    /// requests for the same Tree.
    strict GetContent() -> (resource struct {
        content TreeContent;
    });

    /// Iterate over the names of Trees that are children of this Tree.
    ///
    /// The underlying list of children may change in between calls to
    /// ListChildNames and OpenChild.
    strict ListChildNames(resource struct {
        tree_iterator server_end:TreeNameIterator;
    });

    /// Open a child Tree by name.
    ///
    /// If the child cannot be opened, the given request is closed.
    strict OpenChild(resource struct {
        child_name TreeName;
        tree server_end:Tree;
    });
};
