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

using fuchsia.io;
using zx;

/// Resolves packages from a registry.
///
/// This interface is intended to be implemented by package resolver components, and used by
/// repository administration tools.
[Discoverable]
interface PackageResolver {
    /// Populates or updates the cache of a package with the given selectors as specified by the
    /// update policy.
    ///
    /// Ensures that a package is on the local filesystem.
    ///
    /// Arguments:
    /// * |package_uri| The package URI for a package (TODO: link to docs).
    /// * |selectors| are the package selectors (TODO: link to docs).
    /// * |dir| is a request for a directory that will be resolved when the package has been
    ///   successfully cached.
    ///
    /// Return Values:
    /// * |ZX_OK| if the package was successfully opened.
    /// * |ZX_ERR_ACCESS_DENIED| if the resolver does not have permission to fetch a package blob.
    /// * |ZX_ERR_IO| if there is some other unspecified error during I/O.
    /// * |ZX_ERR_NOT_FOUND| if the package or a package blob does not exist.
    /// * |ZX_ERR_NO_SPACE| if there is no space available to store the package.
    /// * |ZX_ERR_UNAVAILABLE| if the resolver is currently unable to fetch a package blob.
    Resolve(
        string package_uri,
        vector<string> selectors,
        UpdatePolicy update_policy,
        request<fuchsia.io.Directory> dir
        ) -> (zx.status status);
};

/// The |UpdatePolicy| provides different policies to be used when the |PackageResolver| is
/// fetching packages.
struct UpdatePolicy {
    /// Should the resolver fetch the package if it is not present on the local system.
    bool fetch_if_absent;

    /// Should the resolver allow old versions of the package to be used.
    bool allow_old_versions;
};
