// 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.
type StoryCommand = strict resource union {
    /// Adds a Mod.
    2: add_mod AddMod;

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

/// 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.
type AddMod = resource struct {
    /// 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(https://fxbug.dev/42089357): Convert to string
    mod_name vector<string:MAX>:MAX;

    /// 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(https://fxbug.dev/42089357): Remove
    mod_name_transitional string:<MAX, optional>;

    intent Intent;

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

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

    /// 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(https://fxbug.dev/42089357): Remove
    mod_name_transitional string:<MAX, optional>;
};
