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

using fuchsia.mem;

///  The size bound of 1024 is a reasonably low size restriction that meets most
///  canonical selectors we've ecountered.
const uint16 MAXIMUM_RAW_SELECTOR_LENGTH = 1024;

/// The size 64 was chosen because entries in batches are handles to
/// VMOs and there is a limit of 64 handles per fidl message.
const uint16 MAXIMUM_ENTRIES_PER_BATCH = 64;

/// Enum describing the potential failure states of the streaming protocol when serving results
/// to the client over the result iterator.
enum ReaderError {
    // An IO error suggests that parsing of data hierarchy VMOs or writing of formatted data to
    // sockets has failed.
    IO = 1;
};

/// Argument used for Archive selectors, can be either the pre-parsed
/// fidl struct or string representation.
flexible union SelectorArgument {
    /// A Selector defining a pattern-matcher which selects for components within a hierarchy
    /// and properties in a data hierarchy namespaced by component.
    1: Selector structured_selector;

    /// A raw string representing a [fuchsia.diagnostics/Selector].
    /// The Selector defines a pattern-matcher which selects for components within a hierarchy
    /// and properties in a data hierarchy namespaced by component.
    /// NOTE: All StringSelectors parsed from the raw_selector will be interperetted in
    ///       string_pattern mode, giving significance to special characters.
    /// TODO(4601): Link to in-tree documentation for raw selector strings.
    2: string:MAXIMUM_RAW_SELECTOR_LENGTH raw_selector;
};

/// A fidl union containing a complete hierarchy of structured diagnostics
/// data, such that the content can be parsed into a file by itself.
flexible union FormattedContent {
    /// A diagnostics schema encoded as json.
    /// The VMO will contain up to 1mb of diagnostics data.
    1: fuchsia.mem.Buffer json;

    /// A diagnostics schema encoded as text.
    /// The VMO will contain up to 1mb of diagnostics data.
    2: fuchsia.mem.Buffer text;
};

/// Enum specifying the modes by which a user can connect to and stream diagnostics metrics.
enum StreamMode : uint8 {
    /// The stream will serve a snapshot of the diagnostics data at the time of
    /// connection, then end.
    SNAPSHOT = 1;
    /// The stream will serve a snapshot of the diagnostics data at the time of
    /// connection, then subsequent calls to the stream will hang until
    /// new diagnostics data is available.
    SNAPSHOT_THEN_SUBSCRIBE = 2;
    /// Calls to the stream will hang until new diagnostics data is available. Between calls to
    /// the stream, newly arrived data is buffered.
    SUBSCRIBE = 3;
};

// Enum specifying the data types available through the diagnostics platform.
enum DataType : uint8 {
    /// Complete inspect hierarchies on the system.
    INSPECT = 1;
};

flexible union ClientSelectorConfiguration {
    /// A vector of [fuchsia.diagnostics/SelectorArgument] which
    /// provide additional filters to scope data streams with. An empty vector is considered
    /// a misconfiguration and will result in an epitaph signaling incorrect parameters.
    1: vector<SelectorArgument>:MAX selectors;

    /// select_all must be true if set, and specifies that the client wants to retrieve
    /// all data that their connection is able to expose.
    2: bool select_all;
};

/// Parameters needed to configure a stream of diagnostics information.
table StreamParameters {
    /// A [fuchsia.diagnostics/DataType] that specifies the diagnostics data type
    /// to stream to the client.
    /// NOTE: REQUIRED
    1: DataType data_type;

    /// A [fuchsia.diagnostics/StreamMode] that specifies how the
    /// streaming server provides streamed results.
    /// NOTE: REQUIRED
    2: StreamMode stream_mode;

    /// A [fuchsia.diagnostics/Format] that specifies how to format the returned
    /// diagnostics data.
    /// NOTE: REQUIRED
    3: Format format;

    /// Configuration specifying what results the client wants returned from their
    /// connection. The client can request a specific subset of data using a vector
    /// of provided selectors, or can specify that they want all available data.
    /// NOTE: REQUIRED
    4: ClientSelectorConfiguration client_selector_configuration;
};

/// Outer protocol for interacting with the different diagnostics data sources.
[Discoverable]
protocol ArchiveAccessor {
    /// Creates an iterator over diagnostics data on the system.
    ///   * The iterator may be finite by streaming in SNAPSHOT mode, serving only the
    ///     current state of diagnostics data on the system.
    ///   * The iterator may be infinite by streaming in either SNAPSHOT_THEN_SUBSCRIBE
    ///     or SUBSCRIBE mode; the prior first provides iteration over the current state of
    ///     the sytem, and then both provide ongoing iteration over newly arriving diagnostics
    ///     data.
    ///
    /// + request `result stream` a [fuchsia.diagnostics/BatchIterator] that diagnostic
    ///   records are exposed to the client over.
    ///   * epitaphs:
    ///      - INVALID_ARGS: A required argument in the StreamParameters struct was missing.
    ///      - WRONG_TYPE: A selector provided by the StreamParameters struct was incorrectly
    ///                    formatted.
    ///
    /// + request `stream_parameters` is a [fuchsia.diagnostics/StreamParameter] which
    ///   specifies how to configure the stream.
    StreamDiagnostics(StreamParameters stream_parameters, request<BatchIterator> result_stream);
};

/// Conceptually, a directory iterator, where each element in the iterator is a single
/// complete file that can be concatenated with other results.
protocol BatchIterator {
    /// Returns a vector of [fuchsia.diagnostics/FormattedContent] structs
    /// with a format dictated by the format_settings argument provided to the Reader protocol
    /// which spawned this BatchIterator.
    ///
    /// An empty vector implies that the data hierarchy has been fully iterated, and subsequent
    /// GetNext calls will always return the empty vector.
    ///
    /// When the BatchIterator is serving results via subscription model, calls to GetNext will
    /// hang until there is new data available, it will not return an empty vector.
    ///
    /// - returns a vector of FormattedContent structs. Clients connected to a
    ///   Batch are expected to call GetNext() until an empty vector
    ///   is returned, denoting that the entire data hierarchy has been read.
    ///
    /// * error a [fuchsia.diagnostics/ReaderError]
    ///   value indicating that there was an issue reading the underlying data hierarchies
    ///   or formatting those hierarchies to populate the `batch`. Note, these
    ///   issues do not include a single component's data hierarchy failing to be read.
    ///   The iterator is tolerant of individual component data sources failing to be read,
    ///   whether that failure is a timeout or a malformed binary file.
    ///   In the event that a GetNext call fails, that subset of the data hierarchy results is
    ///   dropped, but future calls to GetNext will provide new subsets of
    ///   FormattedDataHierarchies.
    ///
    GetNext() -> (vector<FormattedContent>:MAXIMUM_ENTRIES_PER_BATCH batch) error ReaderError;
};
