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

library fuchsia.diagnostics.inspect;

using fuchsia.mem;

struct JsonSettings {
    // Sets the indentation for the JSON output.
    // A value of 0 means to not include newlines or indent.
    int32 indent;
};

struct TextSettings {
    // Sets the indentation for the text output.
    int32 indent;
};

/// Criteria for how to format
/// the selected Inspect data.
flexible union DisplaySettings {
    1: JsonSettings json;
    2: TextSettings text;
};

// Specify settings for printing Inspect data.
table FormatSettings {
    1: DisplaySettings format;
};

/// Enums describing the potential fail states
/// of the reader service.
enum ReaderError {
    // An unimplemented ReaderSelector format was used.
    UNIMPLEMENTED_FORMAT = 1;
    // A provided selector did not adhere to the selector format.
    INVALID_SELECTOR = 2;
    // An error occured parsing the inspect data.
    IO = 3;
};

/// Selection criteria for data returned by the Reader service.
flexible union ReaderSelector {
    /// The reader applies the selection defined
    /// by structured_selector to all possible inspect data that it
    /// has access to, returning a potential subset, but not superset,
    /// of what would be returned by selection using only the system
    /// configuration.
    1: Selector structured_selector;

    /// The reader parses the string-based selector
    /// string_selector into a structured selector and then will apply
    /// the selection defined by structured_selector to all possible inspect
    /// data that it has access to, returning a potential subset, but
    /// not a superset of what would be returned by selection using only the
    /// system configuration.
    2: string:1024 string_selector;
};

[Discoverable]
protocol Reader {
    /// Adds a [fuchsia.diagnostics.inspect/ReaderSelector] to the Inspect instance,
    /// which will be used when determining which Inspect data to parse and return.
    /// + request `selector` a [fuchsia.diagnostics.inspect/ReaderSelector]
    ///   defining a specific component-hierarchy and inspect-tree pattern
    ///   of interest to the client.
    /// * error a [fuchsia.diagnostics.inspect/ReaderError]
    ///   value indicating how the call failed.
    ///   - `UNIMPLEMENTED_FORMAT` means that a selector whose format is
    ///     not yet supported was provided.
    ///
    ///   - `INVALID_SELECTOR` means that a selector which had an invalid
    ///     structure was passed in and failed verficiation.
    AddSelector(ReaderSelector selector) -> () error ReaderError;

    /// Removes all previously added ReaderSelectors from the Inspect instance.
    ClearSelectors();

    /// Parses the inspect data of the component hierarchy into a format
    /// specified by the [fuchsia.diagnostics.inspect/FormatSettings] struct,
    /// dump that formatted string to a VMO, and return a buffer to the VMO.
    ///
    /// The inspect data which is parsed is defined both by the static
    /// configuration of the service and the ReaderSelectors which are
    /// currently added to the instance. If no added ReaderSelectors
    /// have been added to the current instance, the default behavior
    /// is to parse all Inspect data that the instance has access to.
    ///
    /// + request `settings` the `fuchsia.diagnostics.inspect/FormatSettings` that
    ///   specifies the format of the read Inspect data.
    /// - response `inspect_data_result` the `fuchsia.mem/Buffer` which contains
    ///   the formatted inspect data.
    /// * error a [fuchsia.diagnostics.inspect/ReaderError]
    ///   value indicating how the call failed.
    ///   - `IO` means that parsing the Inspect VMO or writing the formatted data
    ///      failed.
    Format(FormatSettings settings) -> (fuchsia.mem.Buffer inspect_data_result) error ReaderError;
};
