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

[Discoverable]
protocol ModuleResolver {
    // Finds Modules (contained in Fuchsia packages) that satisfy the constraints
    // specified in |query|. Module resolution is done by matching the requested
    // |query.action| and |query.parameter_constraints| (with both names and
    // types) against actions and constraints specified in module manifests.
    //
    // If no results could be found, |response.results| will be empty.
    //
    // For detailed information on the resolution process, see
    // docs/modular/module_resolution.md.
    //
    // TODO(thatguy): Offer some kind of fallback instruction/option to clients
    // in the case of no results.
    FindModules(FindModulesQuery query) -> (FindModulesResponse response);
};

// Mirrors the information present in a Intent. Where a Intent is meant to
// interface between Modules and the Framework, this structure is specific to
// the interface between the Framework and the ModuleResolver.
//
// In that role, it has references to structures and concepts that are only
// visible within the abstraction layer of the Framework.
struct FindModulesQuery {
    // The handler is a module URL; if the handler is specified, the search for
    // (action, parameter_constraints) is scoped within the specified handler.
    string? handler;
    string action;
    vector<FindModulesParameterConstraint> parameter_constraints;
};

struct FindModulesParameterConstraint {
    string param_name;
    vector<string> param_types;
};

enum FindModulesStatus {
    // A search was successfully conducted.
    SUCCESS = 0;
    // |FindModulesQuery.handler| was specified but the resolver doesn't know
    // about it.
    UNKNOWN_HANDLER = 1;
};

struct FindModulesResponse {
    FindModulesStatus status;
    vector<FindModulesResult> results;
};

struct FindModulesResult {
    // The ID of the Module. For now, this is the URL of the Module binary.
    string module_id;

    // The Module's manifest file (see docs/manifests/module.md).
    ModuleManifest? manifest;
};