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

// StoryCommands are POD structures that describe the set of operations that
// can be performed on a story by components outside the modular framework. All commands are:
//
//   (1) Scoped to a single story
//   (2) Idempotent: issuing the same command twice yields the same result
//   (3) Symmetrical with observation: the same structures are used to describe
//       operations to watchers of a story (through SessionWatcher) as are used
//       to control a story.
union StoryCommand {
    // Sets the focus state of the story to |set_focus_state.focused|.
    SetFocusState set_focus_state;

    // Adds a Mod.
    AddMod add_mod;

    // Removes an existing Mod.
    RemoveMod remove_mod;

    // Sets the value of a Link.
    SetLinkValue set_link_value;

    // Brings focus to a mod.
    FocusMod focus_mod;

    // Updates the kind_of_proto_story option in a story.
    SetKindOfProtoStoryOption set_kind_of_proto_story_option;
};

struct SetFocusState {
    bool focused;
};

// Adds a mod described by |intent| to the story with name |mod_name|. If
// |mod_name| already exists in the story, the mod is updated.
struct AddMod {
    // The name of the mod within the story. The mod's name acts as the unique
    // ID of the mod, scoped to the story in which it is contained. Since
    // AddMod is reused for observation and mod names are vector<string>
    // inside the framework, they are vector<string> here as well.
    //
    // Clients should treat the full vector as a single opaque value.
    vector<string> mod_name;
    Intent intent;

    // |surface_relation| defines the visual relationship between this mod and the
    // mod at |surface_parent_mod_name|.
    SurfaceRelation surface_relation;
    vector<string>? surface_parent_mod_name;
};

// Removes the mod under |mod_name| from the story.
struct RemoveMod {
    vector<string> mod_name;
};

// Sets the value of link at |path| to |value|.
struct SetLinkValue {
    LinkPath path;
    fuchsia.mem.Buffer? value;
};

// Instructs the session shell to focus the mod under |mod_name|.
struct FocusMod {
    vector<string> mod_name;
};

// Updates the kind_of_proto_story option in a story.
struct SetKindOfProtoStoryOption {
    bool value;
};
