// 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;

/// Metadata that define the runtime properties of a Module.
struct ModuleManifest {
    /// The relative path from the root of the package where the Module executable
    /// file can be found.
    /// TODO(MF-94): Extract a module's URL from its cmx manifest instead of
    /// here.
    string binary;

    /// A human-readable string that can be used when suggesting this Module.
    string? suggestion_headline;

    /// A list of intents that this module is able to handle.
    vector<IntentFilter>? intent_filters;

    /// Identifies the pattern with which to compose this module with others.
    string? composition_pattern;

    /// Defines the color of the placeholder widget used while the module loads.
    string? placeholder_color;
};

/// This struct is used to describe an intent that a module is able to handle.
struct IntentFilter {
    /// The action this module is able to handle.
    string action;

    /// Includes the name and types of entities for the parameters required to
    /// execute specified [action].
    vector<ParameterConstraint> parameter_constraints;
};

struct ParameterConstraint {
    string name;
    /// The entity type that is valid for this parameter.
    string type;
};
