// 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
closed 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.
    strict 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;
};
