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

using fuchsia.modular;

// The `StoryModelMutation` union represents the set of all possible low-level mutations to data
// for a single story. A vector of mutations represent mutations that are to be applied to the
// model in a single transaction.
//
// This structured is used internally in `sessionmgr` and is not exposed to any clients outside
// that process. Clients will typically construct these indirectly using convenience methods on the
// `StoryMutator` class.
union StoryModelMutation {
  // Sets the value of |StoryModel.visibility_state|.
  fuchsia.modular.StoryVisibilityState set_visibility_state;

  // Sets the value of |StoryModel.runtime_state|.
  fuchsia.modular.StoryState set_runtime_state;
};
