// Copyright 2016 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;

/// Information about a story as provided to the SessionShell.
type StoryInfo = struct {
    /// URL of the first module run in this story. This module is free to
    /// run more modules in the story. Used for display purposes only.
    // TODO(thatguy): Remove this. It is not being set any more.
    url string:<MAX, optional>;

    /// The ID of the Story, used to reference it in method arguments.
    id string:MAX;

    /// Wallclock time when the story was last focused. A UTC time in
    /// nanoseconds since UNIX epoch (1970-01-01 00:00).
    ///
    /// A value of zero means the story has never been focused.
    last_focus_time int64;

    /// Data the SessionShell wants to keep associated with this Story, like
    /// title, a color, or a display rank.
    extra vector<StoryInfoExtraEntry>:<MAX, optional>;
};

/// Information about a story as provided to the SessionShell.
/// For transition purposes only.
type StoryInfo2 = resource table {
    /// The ID of the Story, used to reference it in method arguments.
    1: id string:MAX;

    /// Wallclock time when the story was last focused. A UTC time in
    /// nanoseconds since UNIX epoch (1970-01-01 00:00).
    ///
    /// A value of zero means the story has never been focused.
    2: last_focus_time int64;

    /// Collection of user-defined key-value attributes that describe
    /// this story.
    ///
    /// The `Annotation.value` field of each `Annotation` is always set.
    3: annotations vector<Annotation>:MAX_ANNOTATIONS_PER_STORY;
};

type StoryInfoExtraEntry = struct {
    key string:MAX;
    value string:MAX;
};
