// Copyright 2016 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.sys;

using fuchsia.mem;
using zx;

/// Information given to components at startup.
///
/// For ELF binaries, this information is provided in the initialization
/// message given to `libc` by `fuchsia.process.Launcher`.
type StartupInfo = resource struct {
    /// The launch info for the component to start.
    launch_info LaunchInfo;

    /// The namespace in which to run the component.
    flat_namespace FlatNamespace;

    /// Key string value string map of the component's program metadata,
    /// obtained from its component manifest.
    program_metadata vector<ProgramMetadata>:optional;

    // TODO(abarth): Add more fields to this struct relating to component and
    // environment identity.
};

/// Program information about a component.
type ProgramMetadata = struct {
    /// Key for program metadata pair. E.g. "binary" for an ELF binary
    /// component, or "data" for a flutter/dart component.
    key string;

    /// Value for program metadata pair. E.g. "bin/app" for a "binary" key, or
    /// "data/foo" for a flutter/dart component.
    value string;
};

/// A binary representation of a component.
///
/// Typically provided to `Runner.StartComponent` when starting a component.
type Package = resource struct {
    /// A read-only binary representation of the component. For example, if the
    /// component is intended to run in the Dart virtual machine, this data
    /// might contain a dartx package.
    data box<fuchsia.mem.Buffer>;

    /// A directory containing the contents of the package. For example, if the
    /// component is stored in pkgfs, this directory will be the pkgfs
    /// directory containing the package.
    directory zx.handle:<CHANNEL, optional>;

    /// Resolved URL of the component. This is the url specified in
    /// `startup_info` after following redirects and resolving relative paths.
    resolved_url component_url;
};

/// An interface for running components.
///
/// Typically exposed by components that provide execution environments for
/// particular classes of programs. For example, the Dart virtual machine
/// exposes this interface to run Dart programs.
@discoverable
protocol Runner {
    /// Execute the given component.
    ///
    /// Upon startup, the component is to be given the information in
    /// `startup_info`, but the mechanism by which the component receives that
    /// information is up to the component runner.
    ///
    /// The `controller` interface request typically originates from the
    /// `Launcher.CreateComponent` message that caused this component to be
    /// started.
    StartComponent(resource struct {
        package Package;
        startup_info StartupInfo;
        controller server_end:<ComponentController, optional>;
    });
};
