// Copyright 2019 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.
@available(added=7)
library fuchsia.session;

using fuchsia.url;

/// A protocol used to launch sessions.
@discoverable
protocol Launcher {
    /// Launches the session detailed in `configuration`.
    ///
    /// If a session is currently running, the component associated with the running
    /// session will be destroyed.
    ///
    /// + `configuration` describes the session to launch.
    /// * error `LaunchError.INVALID_ARGS` if `configuration.session_url` is not set.
    /// * error `LaunchError.NOT_FOUND` if `configuration.session_url`
    ///   could not be resolved.
    /// * error `LaunchError.DESTROY_COMPONENT_FAILED` if an existing session component
    ///   could not be destroyed. The existing session remains running at this point.
    /// * error `LaunchError.CREATE_COMPONENT_FAILED` if the session component
    ///   could not be started. No session will be running at this point.
    Launch(struct {
        configuration LaunchConfiguration;
    }) -> (struct {}) error LaunchError;
};

/// An error that occurs when launching a session.
type LaunchError = flexible enum {
    /// The session's `LaunchConfiguration` is malformed.
    INVALID_ARGS = 1;

    /// There was an error resolving the session's component URL.
    NOT_FOUND = 2;

    /// The session component could not be destroyed.
    DESTROY_COMPONENT_FAILED = 3;

    /// The session component could not be created.
    CREATE_COMPONENT_FAILED = 4;
};

/// A protocol used to restart the currently running session.
@discoverable
protocol Restarter {
    /// Restarts the session.
    ///
    /// * error `RestartError.NOT_RUNNING` if there is no
    ///   currently running session to restart.
    /// * error `RestartError.DESTROY_COMPONENT_FAILED` if an existing session component
    ///   could not be destroyed. The existing session remains running at this point.
    /// * error `RestartError.CREATE_COMPONENT_FAILED` if the session component
    ///   could not be started. No session will be running at this point.
    Restart() -> (struct {}) error RestartError;
};

/// An error that occurs when restarting a session.
type RestartError = flexible enum {
    /// There is no currently running session to restart.
    NOT_RUNNING = 1;

    /// There was an error resolving the session's component URL.
    NOT_FOUND = 2;

    /// The session component could not be destroyed.
    DESTROY_COMPONENT_FAILED = 3;

    /// The session component could not be created.
    CREATE_COMPONENT_FAILED = 4;
};

/// Describes a session to launch.
type LaunchConfiguration = table {
    /// The component URL of the session.
    1: session_url string:fuchsia.url.MAX_URL_LENGTH;
};
