// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1

syntax = "proto3";

package hashicorp.vagrant;

option go_package = "github.com/hashicorp/vagrant/internal/server/proto/ruby_vagrant";

import "google/protobuf/empty.proto";
import "google/protobuf/any.proto";
import "google/rpc/error_details.proto";

import "plugin.proto";

// The service that is implemented for the server backend.
service RubyVagrant {
  // Gets available ruby plugins
  rpc GetPlugins(GetPluginsRequest) returns (GetPluginsResponse);
  rpc ParseVagrantfile(ParseVagrantfileRequest) returns (ParseVagrantfileResponse);
  rpc ParseVagrantfileProc(ParseVagrantfileProcRequest) returns (ParseVagrantfileResponse);
  rpc ParseVagrantfileSubvm(ParseVagrantfileSubvmRequest) returns (ParseVagrantfileResponse);
  rpc ParseVagrantfileProvider(ParseVagrantfileProviderRequest) returns (ParseVagrantfileResponse);
  rpc Stop(google.protobuf.Empty) returns (google.protobuf.Empty);
}

/********************************************************************
* Plugins
********************************************************************/

message GetPluginsRequest {
  string project_path = 1;
}

message GetPluginsResponse {
  repeated Plugin plugins = 1;
}

message Plugin {
  // name of the plugin
  string name = 1;

  // type of the plugin
  Type type = 2;

  // options for the plugin
  google.protobuf.Any options = 3;

  // Supported plugin types, the values here MUST match the enum values
  // in the Go sdk/component package exactly. A test in internal/server
  // validates this.
  enum Type {
    UNKNOWN = 0;
    COMMAND = 1;
    COMMUNICATOR = 2;
    GUEST = 3;
    HOST = 4;
    PROVIDER = 5;
    PROVISIONER = 6;
    SYNCEDFOLDER = 7;
    AUTHENTICATOR = 8;
    LOGPLATFORM = 9;
    LOGVIEWER = 10;
    MAPPER = 11;
    CONFIG = 12;
    PLUGININFO = 13;
    PUSH = 14;
  }
}

/********************************************************************
* Vagrantfile
********************************************************************/

message ParseVagrantfileRequest {
  // Path to the Vagrantfile
  string path = 1;
}

message ParseVagrantfileProcRequest {
  sdk.Args.ProcRef proc = 1;
}

message ParseVagrantfileResponse {
  // Vagrantfile representation
  sdk.Args.Hash data = 1;
}

message ParseVagrantfileSubvmRequest {
  sdk.Config.RawRubyValue subvm = 1;
}

message ParseVagrantfileProviderRequest {
  sdk.Config.RawRubyValue subvm = 1;
  string provider = 2;
}
