// 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? url;

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

    // Wallclock time when the story was last focused. From
    // zx_clock_get(ZX_CLOCK_UTC), thus nanoseconds since UNIX epoch (1970-01-01
    // 00:00 UTC).
    //
    // 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>? extra;
};

struct StoryInfoExtraEntry {
    string key;
    string value;
};
