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

using fuchsia.mem;

/// A user-defined annotation for a story or module.
struct Annotation {
    /// An identfier for this annotation.
    AnnotationKey key;

    /// The contents of this annotation.
    AnnotationValue? value;
};

/// Maximum number of annotations on a single story.
const uint32 MAX_ANNOTATIONS_PER_STORY = 100;

/// Maximum number of annotations on a single module.
const uint32 MAX_ANNOTATIONS_PER_MODULE = 100;

/// Maximum number of annotations that can be passed to either method
/// Annotate() AnnotateModule() in fuchsia.modular protocols that support
/// annotations.
const uint32 MAX_ANNOTATIONS_PER_UPDATE = 50;

/// Maximum length of [`fuchsia.modular/AnnotationKey`].
const uint32 MAX_ANNOTATION_KEY_LENGTH = 256;

/// Maximum length of [`fuchsia.modular/AnnotationValue`] fields:
/// `text` and `bytes`.
const uint32 MAX_ANNOTATION_VALUE_LENGTH = 1024;

/// Maximum length of the [`fuchsia.modular/AnnotationValue.buffer`] field, in
/// bytes.
///
/// Does not apply to other fields; see [`MAX_ANNOTATION_VALUE_LENGTH`].
const uint32 MAX_ANNOTATION_VALUE_BUFFER_LENGTH_BYTES = 102400;

/// An identifier for an [`fuchsia.modular/Annotation`].
using AnnotationKey = string:MAX_ANNOTATION_KEY_LENGTH;

/// The value of a [`fuchsia.modular/Annotation`].
///
/// The actual field used depends on the type of annotation, which is
/// user-defined, and not enforced by the framework.
///
/// The size of `buffer` is limited to
/// `MAX_ANNOTATION_VALUE_BUFFER_LENGTH_BYTES` bytes.
flexible union AnnotationValue {
    1: string:MAX_ANNOTATION_VALUE_LENGTH text;
    2: vector<uint8>:MAX_ANNOTATION_VALUE_LENGTH bytes;
    3: fuchsia.mem.Buffer buffer;
};

/// Error returned from calls to Annotate().
enum AnnotationError {
    /// The `AnnotationValue.buffer` size exceeds the maximum length,
    /// `MAX_ANNOTATION_VALUE_BUFFER_LENGTH_BYTES`.
    VALUE_TOO_BIG = 1;

    /// The total number of annotations on the story or module being annotated
    /// exceeds `MAX_ANNOTATIONS_PER_STORY` or `MAX_ANNOTATIONS_PER_MODULE`.
    TOO_MANY_ANNOTATIONS = 2;

    /// The resource to be annotated was not found and could not be resolved
    /// by, for example, waiting, or creating the missing resource automatically.
    /// This error may be returned by StoryPuppetMaster.AnnotateModule(), which
    /// can wait for a missing Module, but requires the Module's Story exist.
    NOT_FOUND = 3;
};
