// 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.
struct StoryInfo {
    /// 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.
    string:MAX? url;

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

    /// 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.
    int64 last_focus_time;

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

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

    /// 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: int64 last_focus_time;

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

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