blob: 6ae74fb46445c34b38f97ff066f4e1725db51211 [file] [log] [blame]
// 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;
enum ExecuteStatus {
OK = 0;
// Encountered an invalid command.
INVALID_COMMAND = 1;
// The |story_id| provided does not exist or is not visible
// to this client.
INVALID_STORY_ID = 2;
// A story must contain at least one mod, and the commands given
// either don't add one, or remove the last one.
STORY_MUST_HAVE_MODS = 3;
// The mod name specified in AddMod, RemoveMod or SendModCommand
// was not found, or is invalid.
INVALID_MOD = 4;
// Resolution of the intent provided in AddMod returned zero results.
NO_MODULES_FOUND = 5;
// Some error happened while executing the command.
INTERNAL_ERROR = 6;
};
enum ConfigureStoryError : int32 {
/// The story cannot be (re)configured because it was already created.
ERR_STORY_ALREADY_CREATED = 1;
};
struct ExecuteResult {
ExecuteStatus status;
string? story_id;
string? error_message;
};
// Enables control of a session. A session, conceptually, is a single
// full-screen experience of a Fuchsia device. A device can run multiple
// sessions (ie, when one device powers multiple kiosks); that said, sessions
// are siloed from each other.
//
// A session, concretely, is a collection of stories, their state, the modules
// within them, any agents that run to support the mods and the various UI
// shells (session and story shells).
[Discoverable]
protocol PuppetMaster {
// Requests a capability to control a story by name. The name acts as the
// story's unique ID. Calling ControlStory() for the same story name will
// control the same story.
//
// The story name, as well as modification to the story, are durable and
// persist across device reboots. This allows the client to assign its own
// identifiers to stories. Clients wishing to guarantee a new story is
// created should generate a UUIDv4 or similar.
//
// |request| is closed if control cannot be granted.
//
// TODO(thatguy): We want story names to be scoped to the client's namespace.
ControlStory(string story_name, request<StoryPuppetMaster> request);
// Deletes a story associated to |story_name|.
DeleteStory(string story_name) -> ();
// Returns a list of all the names of stories in the session.
GetStories() -> (vector<string> story_names);
};
struct WatchSessionOptions {
};
protocol StoryPuppetMaster {
// Enqueues the given |commands| in the order they are given.
// Can be called as many times as necessary to specify the full
// set of changes to the story.
//
// To execute all enqueued commands, call Execute().
Enqueue(vector<StoryCommand> commands);
// Executes the commands enqueued so far by Enqueue() in order and as
// a batch: no other commands from other clients will be interleaved.
//
// If an error occurs, execution is stopped and an error code
// and message are returned in |result|.
Execute() -> (ExecuteResult result);
// If this story is new, sets the options for its creation. Must be called
// before the first call to Execute(). Any subsequent calls (either on the
// same channel or on a new StoryPuppetMaster for an existing story) are
// ignored. Some StoryOptions can be changed through specific story commands.
// See story_command.fidl for details.
SetCreateOptions(StoryOptions story_options);
// Set the |StoryInfo| extra field for a story that is to be
// created. This should be called before the first call to Execute().
// Any subsequent calls (either on the same channel or on a new
// StoryPuppetMaster for an existing story) are ignored.
// See story_info.fidl for details.
SetStoryInfoExtra(vector<StoryInfoExtraEntry> story_info_extra)
-> () error ConfigureStoryError;
};