// Copyright 2020 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.feedback;

/// Registers data useful to attach in feedback reports (crash, user feedback or bug reports).
///
/// This can be used by components to augment the data attached to all feedback reports. By default
/// the Feedback service attaches data exposed to the platform. This protocol is  useful for data
/// known by certain components in certain products, but that is not exposed to the platform.
///
/// The epitaph ZX_ERR_INVALID_ARGS indicates that the client is sending invalid requests. See
/// below for each request why they might be invalid.
///
/// The epitaph ZX_ERR_NO_RESOURCES indicates that the server can no longer store additional
/// component data and will not service new connections.
@discoverable
protocol ComponentDataRegister {
    /// Upserts, i.e. updates or inserts, extra component data to be included in feedback reports.
    ///
    /// The namespace and each annotation key are used to decide whether to update or insert an
    /// annotation. If an annotation is already present for a given key within the same namespace,
    /// update the value, otherwise insert the annotation with that key under that namespace.
    ///
    /// For instance, assuming these are the data already held by the server (from previous calls
    /// to Upsert()):
    /// ```
    /// {
    ///   "bar": { # namespace
    ///     "channel": "stable",
    ///   },
    ///   "foo": { # namespace
    ///     "version": "0.2",
    ///   }
    /// }
    /// ```
    /// then:
    /// ```
    /// Upsert({
    ///   "namespace": "bar",
    ///   "annotations": [
    ///     "version": "1.2.3.45",
    ///     "channel": "beta",
    ///   ]
    /// })
    /// ```
    /// would result in the server now holding:
    /// ```
    /// {
    ///   "bar": { # namespace
    ///     "channel": "beta", # updated
    ///     "version": "1.2.3.45" # inserted
    ///   },
    ///   "foo": { # namespace
    ///     "version": "0.2", # untouched
    ///   }
    /// }
    /// ```
    ///
    /// Note that the server will only hold at most MAX_NUM_ANNOTATIONS_PER_NAMESPACE distinct
    /// annotation keys per namespace, picking up the latest values.
    Upsert(struct {
        data ComponentData;
    }) -> ();
};

const MAX_NAMESPACE_LENGTH uint32 = 32;
const MAX_NUM_ANNOTATIONS_PER_NAMESPACE uint32 = 16;

/// Data known to a component, but not exposed to the platform, to attach to feedback reports.
type ComponentData = table {
    /// The top-level namespace associated with the data:
    /// * Is intended to group related data together and reduce data key collisions across
    ///   namespaces.
    /// * May be shared by multiple clients, e.g., there could be multiple clients within the same
    ///   component or across components that want to expose related data and they would all use
    ///   the same namespace.
    /// * Will be prefixed to every data key passed within that namespace in all feedback reports,
    ///   e.g., the annotation "version" would appear as "foo.version" in all feedback reports if
    ///   the namespace is "foo".
    /// * Must match [a-z\-]+, i.e. only lowercase letters and hyphens or this will result in a
    ///   ZX_ERR_INVALID_ARGS epitaph.
    /// * Must not match a reserved namespace used internally for platform data, e.g., "build", or
    ///   this will result in a ZX_ERR_INVALID_ARGS epitaph. The list of reserved namespaces is
    ///   internal and subject to change for now.
    1: namespace string:MAX_NAMESPACE_LENGTH;

    /// A vector of key-value string pairs, e.g., `<"version", "1.2.3.45">`.
    ///
    /// Keys:
    /// * Should be unique as only the latest value for a given key in the vector will be
    ///   considered.
    /// * Must match [a-z\-\.]+, i.e. only lowercase letters, hyphens and periods. Use periods for
    ///   sub-namespacing, e.g., "build.label" and "build.type", so that related annotations are
    ///   grouped together (here related to "build") when sorted lexicographically.
    2: annotations vector<Annotation>:MAX_NUM_ANNOTATIONS_PER_NAMESPACE;
};
