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

/// 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.
resource union StoryCommand {
    // Deprecated operation: set_focus_state.
    1: reserved;

    /// Adds a Mod.
    2: AddMod add_mod;

    /// Removes an existing Mod.
    3: RemoveMod remove_mod;

    // Deprecated operation: set_link_value.
    4: reserved;

    // Deprecated operation: focus_mod.
    5: reserved;

    // Deprecated operation: set_kind_of_proto_story_option.
    6: reserved;
};

/// 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.
resource 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:MAX>
    /// inside the framework, they are vector<string:MAX>:MAX here as well.
    ///
    /// Clients should treat the full vector as a single opaque value.
    ///
    /// Clients should provide `mod_name_transitional` instead.
    /// If both are provided, `mod_name` is ignored.
    ///
    // TODO(fxbug.dev/16089): Convert to string
    vector<string:MAX>:MAX mod_name;

    /// The name of the mod within the story. This should be used instead of
    /// `mod_name`. If provided, it is equivalent to passing `mod_name` with
    /// a single item. If both are provided, `mod_name` is ignored.
    ///
    // TODO(fxbug.dev/16089): Remove
    string:MAX? mod_name_transitional;

    Intent intent;

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

/// Removes the mod under `mod_name` from the story.
struct RemoveMod {
    /// The name of the mod within the story.
    ///
    /// Clients should provide `mod_name_transitional` instead.
    /// If both are provided, `mod_name` is ignored.
    ///
    // TODO(fxbug.dev/16089): Convert to string
    vector<string:MAX>:MAX mod_name;

    /// The name of the mod within the story. This should be used instead of
    /// `mod_name`. If provided, it is equivalent to passing `mod_name` with
    /// a single item. If both are provided, `mod_name` is ignored.
    ///
    // TODO(fxbug.dev/16089): Remove
    string:MAX? mod_name_transitional;
};
