// 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]
protocol 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_url` The package URL 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_INTERNAL` if the resolver encountered an otherwise unspecified error while
    ///   handling the request
    /// * `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_ADDRESS_UNREACHABLE` if the resolver does not know about the repo.
    /// * `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.
    // TODO(fxb/45811) change `package_url` from string to PackageUrl
    Resolve(
        string package_url,
        vector<string> selectors,
        UpdatePolicy update_policy,
        request<fuchsia.io.Directory> dir
        ) -> (zx.status status);

    /// Determines the hash of a package.
    ///
    /// Arguments:
    /// * `package_url` The package URL for a package.
    ///
    /// Return Values:
    /// * `ZX_OK` if the hash of the package was successfully obtained.
    /// * `ZX_ERR_INTERNAL` if the resolver encountered an otherwise unspecified error while
    ///   handling the request
    /// * `ZX_ERR_NOT_FOUND` if the package does not exist.
    /// * `ZX_ERR_ADDRESS_UNREACHABLE` if the resolver does not know about the repo.
    GetHash(
        PackageUrl package_url
        ) -> (BlobId meta_far_blob_id) error zx.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;
};
