// Copyright 2019 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_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;

  // (Optional) 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;

  // (Optional) 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;

  // (Optional) 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;

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

  // (Optional) 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;

  // (Optional) 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;

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

  // (Optional) 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;

  // (Optional) 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;

  // (Optional) 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;
}
