blob: 80eafc42309cdfbdfd5345514b3f1630130ef23b [file] [log] [blame]
// 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;
// The size bound of 100 is a reasonably low limit chosen based on observed
// strings used as identifiers.
const MAX_STRING_SELECTOR_LENGTH uint16 = 100;
// The size bound of 25 is a reasonably low limit chosen based on observed
// component hierarchy depths, and awareness of maximum zircon message sizes.
const MAX_MONIKER_SEGMENTS uint16 = 25;
// The size bound of 100 is a reasonably low limit chosen based on observed Inspect
// hierarchy use cases.
const MAX_DATA_HIERARCHY_DEPTH uint16 = 100;
/// StringSelector is an union defining different ways to describe a pattern to match
/// strings against.
type StringSelector = flexible union {
/// This is a provided string that defines a pattern to
/// match against. The parser treats asterisks (*), colons (:) and backslashes
/// (\) as special characters.
///
/// If you wish to match against literal asterisks (*), they must be escaped.
/// If you wish to match against literal backslashes (\), they must be escaped.
/// If you wish to match against literal colons (:), they must be escaped.
///
/// eg: abc will match any string with the exact name "abc".
/// eg: a\* will match any string with the exact name "a*".
/// eg: a\\* will match any that starts with exactly "a\".
/// eg: a* will match any string that starts with "a".
/// eg: a*b will match any string that starts with a and ends with b.
/// eg: a*b*c will match any string that starts with a and ends with c, with `b`
/// in the middle.
///
/// In addition, the "**" literal is treated as a special sequence that may match
/// multiple levels in a component selector only. See |ComponentSelector| for
/// details.
1: string_pattern string:MAX_STRING_SELECTOR_LENGTH;
/// This is a provided string that defines an exact string to match against. No
/// characters are treated as special, or carry special syntax.
2: exact_match string:MAX_STRING_SELECTOR_LENGTH;
};
/// Specifies a pattern of component monikers which
/// identify components being selected for.
///
/// Component selectors support wildcarding, which will glob a single "level" of a
/// component moniker. eg:
/// core/*/echo
/// will match all echo instances running only in realms directly under core, but none
/// nested further.
///
/// Component selectors also support a recursive wildcard, which will glob multiple
/// "levels" of a component moniker. eg:
/// core/**
/// will match all component instances running under core/ and all descendants of it.
/// Note that the wildcard does not select core itself. Clients that wish to choose a
/// subtree including the root should pass two selectors, eg:
/// core
/// core/**
/// The recursive wildcard is only allowed as the final segment of the selector.
type ComponentSelector = table {
/// Vector encoding the a pattern for monikers of components being selected for.
/// These monikers are child-monikers relative to a "root" hierarchy that the archivist
/// is aware of.
///
/// There must be at least one StringSelector provided, which
/// specifies the component names that are matched by
/// the current selector.
1: moniker_segments vector<StringSelector>:MAX_MONIKER_SEGMENTS;
};
/// A selector defining a set of nodes to match, for which the entire subtree including
/// those nodes are selected.
type SubtreeSelector = struct {
/// A vector of StringSelectors which serve as a pattern matcher
/// for paths through a hierarchy of named nodes. Each entry in the vector
/// is a selector for a single named node in a data hierarchy. The vector
/// of selectors for named nodes, then, defines a selector on paths through the
/// data hierarchy.
///
/// Node paths support wildcarding, which will glob a single level of a
/// node hierarchy. eg:
/// root/a/b/*/d
/// will match all nodes named d which are below some child of node b.
/// root/a/b/c*
/// will match all nodes below b which start with the character "c".
node_path vector<StringSelector>:MAX_DATA_HIERARCHY_DEPTH;
};
/// A selector defining a set of nodes to match, and on those matched nodes a set of named
/// properties to match.
type PropertySelector = struct {
/// A vector of StringSelectors which serve as a pattern matcher
/// for paths through a hierarchy of named nodes. Each entry in the vector
/// is a selector for a single named node in a data hierarchy. The vector
/// of selectors for named nodes, then, defines a selector on paths through the
/// data hierarchy.
///
/// Node paths support wildcarding, which will glob a single level of a
/// node hierarchy. eg:
/// root/a/b/*/d
/// will match all nodes named d which are below some child of node b.
/// root/a/b/c*
/// will match all nodes below b which start with the character "c".
node_path vector<StringSelector>:MAX_DATA_HIERARCHY_DEPTH;
/// A StringSelector which serves as a pattern matcher for
/// string-named properties on a node in a data hierarchy.
///
/// target_properties supports wildcarding, which will match against all properties
/// on any node matched by node_path.
target_properties StringSelector;
};
/// TreeSelector represents a selection request on a hierarchy of named nodes, with
/// named properties on those nodes.
type TreeSelector = flexible union {
/// A selector defining a set of nodes to match, for which the entire subtree including
/// those nodes are selected.
1: subtree_selector SubtreeSelector;
/// A selector defining a set of nodes to match, and on those matched nodes a set of named
/// propperties to match.
2: property_selector PropertySelector;
};
/// Structured selector containing all required information for pattern-matching onto
/// string-named properties owned by nodes in a data hierarchy, where data hierarchies belong
/// to specific components.
///
/// These selectors are represented in text form as three segments, colon delimited,
/// specifying:
/// <component_moniker>:<node_selector>:<property_selector>
/// Examples:
/// Property selection:
/// realm1/realm2/echo:root/active_users:user_count
///
/// Subtree selection:
/// realm1/realm2/echo:root/active_users
type Selector = table {
/// The selector defining a pattern of component monikers to match
/// against.
1: component_selector ComponentSelector;
/// The selector defining data hierarchy properties to match against
/// within the data hierarchies owned by components matched by
/// `component_selector`.
2: tree_selector TreeSelector;
};