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

using fuchsia.mem;

/// The value of an [`fuchsia.session/Annotation`].
///
/// The actual field used depends on the type of annotation.
resource union Value {
    1: string:MAX text;
    2: fuchsia.mem.Buffer buffer;
};

/// An annotation defined dynamically by key/value pair.
///
/// The Session Framework does not constrain the contents of `key` and `value`
/// in any way. Cooperating components that exchange annotations must define
/// and validate annotation entries based on their own conventions.
resource struct Annotation {
    /// An identfier for this annotation.
    string:MAX key;

    /// The content of this annotation.
    Value? value;
};

/// Error returned from methods that operate on annotations.
enum AnnotationError {
    /// The session rejected the provided annotations.
    ///
    /// Reasons for rejection may be due to annotations that violate defined
    /// type constraints, such as:
    ///
    /// * The `Value` size exceeds the maximum length
    /// * The total number of annotations on an element exceeds `MAX`
    REJECTED = 1;

    /// The annotations on an element could not be returned.
    ///
    /// Reasons for this failure may be due to inability to read buffer bytes.
    NOT_FOUND = 2;
};

/// The annotations applied to an element.
resource table Annotations {
    /// A list of dynamically-defined annotations.
    1: vector<Annotation>:MAX custom_annotations;
};
