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

/// A content-addressed merkle root that describes an artifact that is tracked by the
/// packaging system.
type BlobId = struct {
    merkle_root array<uint8, 32>;
};

/// A tuple of the content-addressed merkle root for an artifact, along with that
/// artifact's length in bytes.
type BlobInfo = struct {
    blob_id BlobId;
    length uint64;
};

/// A fuchsia-pkg:// URL indicating a package.
/// https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#package_identity
type PackageUrl = struct {
    url string:2048;
};

/// A fuchsia-pkg:// URL indicating a repository.
/// https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#repository_identity
type RepositoryUrl = struct {
    url string:2048;
};

/// A single entry in the package index.
type PackageIndexEntry = struct {
    package_url PackageUrl;
    meta_far_blob_id BlobId;
};

/// A package resolution context, used when resolving package URLs relative to
/// another package.
type ResolutionContext = struct {
    bytes vector<uint8>:MAX_RESOLUTION_CONTEXT_SIZE;
};

// TODO(fxbug.dev/100050): Change this length to something smaller once
// fuchsia.pkg implements subpackages, assuming fuchsia.pkg implements the
// package context value as a much smaller lookup key (such as a package hash to
// the package containing the subpackage map). Make a related change to
// the component's MAX_RESOLUTION_CONTEXT_SIZE in
// //sdk/fidl/fuchsia.component.resolution/component.fidl

/// The maximum number of bytes for a `ResolutionContext`.
///
/// Note that this value must be less than or equal to
/// `fuchsia.component.resolution::MAX_RESOLUTION_CONTEXT_SIZE`, since the
/// component resolver is expected to copy or contain the context provided by
/// the package resolver.
const MAX_RESOLUTION_CONTEXT_SIZE uint32 = 8192;
