// 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.
type ModuleManifest = struct {
    /// The relative path from the root of the package where the Module executable
    /// file can be found.
    /// TODO(fxbug.dev/16039): Extract a module's URL from its cmx manifest instead of
    /// here.
    binary string:MAX;

    /// A human-readable string:MAX that can be used when suggesting this Module.
    /// DEPRECATED.
    suggestion_headline string:<MAX, optional>;

    /// A list of intents that this module is able to handle.
    intent_filters vector<IntentFilter>:<MAX, optional>;

    /// Identifies the pattern with which to compose this module with others.
    composition_pattern string:<MAX, optional>;

    /// Defines the color of the placeholder widget used while the module loads.
    placeholder_color string:<MAX, optional>;
};

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

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

    /// Defines presentation properties for suggestions of this action.
    action_display ActionDisplay;
};

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

/// Defines how a suggestion of an action will be presented.
type ActionDisplay = table {
    /// Defines presentation fields for a suggestion. The string:MAX fields might be
    /// templated and will be filled from data in `parameter_mapping`.
    /// For example: "Listen to $artistName"
    1: display_info DisplayInfo;

    /// Fields to be replaced in the given `display_info` templated strings.
    /// In the example above, we would map name=artistName to the intent field
    /// artist.name where artist is the intent parameter name and name a field
    /// of it.
    2: parameter_mapping vector<ParameterMapping>:MAX;
};

/// Presentation information about the suggestion.
type DisplayInfo = table {
    /// The title of the suggestion.
    1: title string:MAX;

    /// A subtitle for the suggestion.
    2: subtitle string:MAX;

    /// A url from which to fetch the icon of the suggestion.
    3: icon string:MAX;
};

/// Defines pairs that will be replaced in the DisplayInfo.
type ParameterMapping = table {
    /// The name of the variable to be replaced in the template.
    1: name string:MAX;

    /// The path in the intent parameter to get that name.
    /// `PARAMETER_PROPERTY` = string:MAX | string:MAX . `PARAMETER_PROPERTY`
    /// The first string:MAX in the dot-separated string:MAX is the name of the intent
    /// parameter and the following are nested subfields.
    2: parameter_property string:MAX;
};
