// 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.
type EnvironmentDecl = table {
    /// The name of this environment.
    1: name fuchsia.component.name;

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

    /// 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: runners vector<RunnerRegistration>:MAX;

    /// 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: resolvers vector<ResolverRegistration>:MAX;

    /// Expose capabilties to debug section when component manager allows it.
    ///
    /// These capabilities are accessible to any component in the environment
    /// with a `use` declaration with `source == debug`.  Only capabilities
    /// intended to support development should be declared here, and they are
    /// only allowed if explicitly included in the component manager allowlist.
    5: debug_capabilities vector<DebugRegistration>:MAX;

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

/// Specifies how a declared environment's initial set of properties are assigned.
type EnvironmentExtends = strict enum {
    /// 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.
type RunnerRegistration = table {
    /// The name of the runner capability as it's exposed to, offered, or
    /// defined by this component.
    1: source_name fuchsia.component.name;

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

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

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

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

    /// 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: scheme fuchsia.component.url_scheme;
};

/// Declares a capability registered in the debug section of an environment.
type DebugRegistration = flexible union {
    1: protocol DebugProtocolRegistration;
};

/// Registers a protocol in the environment as a debug capability. This makes
/// it available to any component in the environment that uses it with
/// `source == debug`.
///
/// To learn more about protocols, see:
/// https://fuchsia.dev/fuchsia-src/glossary#protocol
type DebugProtocolRegistration = table {
    /// The provider of the capability relative to the component itself. Must be
    /// `parent`, `self`, or `child`.
    1: source Ref;

    /// Name identifying the protocol being offered.
    2: source_name fuchsia.component.name;

    /// The name by which the capability is being offered.
    3: target_name fuchsia.component.name;
};
