// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.devtools.resultstore.v2;

import "google/protobuf/wrappers.proto";

option go_package = "google.golang.org/genproto/googleapis/devtools/resultstore/v2;resultstore";
option java_multiple_files = true;
option java_outer_classname = "FileProto";
option java_package = "com.google.devtools.resultstore.v2";

// The metadata for a file or an archive file entry.
message File {
  // If known, the hash function used to compute this digest.
  enum HashType {
    // Unknown
    HASH_TYPE_UNSPECIFIED = 0;

    // MD5
    MD5 = 1;

    // SHA-1
    SHA1 = 2;

    // SHA-256
    SHA256 = 3;
  }

  // The identifier of the file or archive entry.
  // User-provided, must be unique for the repeated field it is in. When an
  // Append RPC is called with a Files field populated, if a File already exists
  // with this ID, that File will be overwritten with the new File proto.
  string uid = 1;

  // The URI of a file.
  // This could also be the URI of an entire archive.
  // Most log data doesn't need to be stored forever, so a ttl is suggested.
  // Note that if you ever move or delete the file at this URI, the link from
  // the server will be broken.
  string uri = 2;

  // The length of the file in bytes.  Allows the filesize to be shown in the
  // UI.  Omit if file is still being written or length is not known.  This
  // could also be the length of an entire archive.
  google.protobuf.Int64Value length = 3;

  // The content-type (aka MIME-type) of the file.  This is sent to the web
  // browser so it knows how to handle the file. (e.g. text/plain, image/jpeg,
  // text/html, etc). For zip archives, use "application/zip".
  string content_type = 4;

  // If the above path, length, and content_type are referring to an archive,
  // and you wish to refer to a particular entry within that archive, put the
  // particular archive entry data here.
  ArchiveEntry archive_entry = 5;

  // A url to a content display app/site for this file or archive entry.
  string content_viewer = 6;

  // Whether to hide this file or archive entry in the UI.  Defaults to false.
  // A checkbox lets users see hidden files, but they're hidden by default.
  bool hidden = 7;

  // A short description of what this file or archive entry contains. This
  // description should help someone viewing the list of these files to
  // understand the purpose of this file and what they would want to view it
  // for.
  string description = 8;

  // The digest of this file in hexadecimal-like string if known.
  string digest = 9;

  // The algorithm corresponding to the digest if known.
  HashType hash_type = 10;
}

// Information specific to an entry in an archive.
message ArchiveEntry {
  // The relative path of the entry within the archive.
  string path = 1;

  // The uncompressed length of the archive entry in bytes.  Allows the entry
  // size to be shown in the UI.  Omit if the length is not known.
  google.protobuf.Int64Value length = 2;

  // The content-type (aka MIME-type) of the archive entry. (e.g. text/plain,
  // image/jpeg, text/html, etc). This is sent to the web browser so it knows
  // how to handle the entry.
  string content_type = 3;
}
