// Copyright 2020 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.sys2;

using fuchsia.component;

/// Declares an environment which configures a realm.
table EnvironmentDecl {
    /// The name of this environment.
    1: fuchsia.component.name name;

    /// Specifies how the initial state of this environment is constructed.
    2: EnvironmentExtends extends;

    /// List of runners available in this environment.
    ///
    /// This list determines the total set of runners that are available for any
    /// component in the environment to use.
    3: vector<RunnerRegistration>:MAX runners;

    /// List of component resolvers and the URL schemes they are registered to resolve.
    /// These registrations determine how components are resolved in the realm.
    /// If the component URL scheme does not match any of these resolvers, URL resolution
    /// is delegated to the parent environment, if this environment `extends` from `REALM`.
    4: vector<ResolverRegistration>:MAX resolvers;

    /// The duration in milliseconds that the component will have to stop before
    /// it is killed.
    5: uint32 stop_timeout_ms;
};

/// Specifies how a declared environment's initial set of properties are assigned.
enum EnvironmentExtends {
    /// The environment has no initial set of properties.
    NONE = 0;
    /// The environment's initial set of properties are inherited from its realm.
    /// Inherited properties include any fields defined in `EnvironmentDecl`.
    REALM = 1;
};

/// A repository of the runners available in an environment.
table RunnerRegistration {
    /// The name of the runner capability as it's exposed to, offered, or
    /// defined by this component.
    1: fuchsia.component.name source_name;

    /// The provider of the capability relative to the component itself. Must be
    /// `parent`, `self`, or `child`.
    2: Ref source;

    /// The name by which the runner is made available in this environment.
    3: fuchsia.component.name target_name;
};

/// A mapping of URL scheme to resolver name.
table ResolverRegistration {
    /// The name of the resolver.
    1: fuchsia.component.name resolver;

    /// The provider of the capability relative to the component itself. Must be
    /// `parent`, `self`, or `child`.
    2: Ref source;

    /// The URL scheme the resolver is registered to handle.
    /// Only one resolver may be registered to a particular URL scheme.
    /// The URL scheme must start with a lowercase ASCII letter (a-z), and may contain
    /// lowercase ASCII letters, digits, `+`, `-`, and `.`.
    3: fuchsia.component.url_scheme scheme;
};
