// 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 bytes: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_LENGTH (to be
// renamed MAX_RESOLUTION_CONTEXT_SIZE) in
// //sdk/fidl/fuchsia.component.resolution/resolver.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_LENGTH`, since the
/// component resolver is expected to copy or contain the context provided by
/// the package resolver.
const MAX_RESOLUTION_CONTEXT_SIZE uint32 = 8192;
