// Copyright 2016-2018, Pulumi Corporation.
//
// 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";

import "plugin.proto";
import "google/protobuf/empty.proto";

package pulumirpc;

// LanguageRuntime is the interface that the planning monitor uses to drive execution of an interpreter responsible
// for confguring and creating resource objects.
service LanguageRuntime {
    // GetRequiredPlugins computes the complete set of anticipated plugins required by a program.
    rpc GetRequiredPlugins(GetRequiredPluginsRequest) returns (GetRequiredPluginsResponse) {}
    // Run executes a program and returns its result.
    rpc Run(RunRequest) returns (RunResponse) {}
    // GetPluginInfo returns generic information about this plugin, like its version.
    rpc GetPluginInfo(google.protobuf.Empty) returns (PluginInfo) {}
}

message GetRequiredPluginsRequest {
    string project = 1; // the project name.
    string pwd = 2;     // the program's working directory.
    string program = 3; // the path to the program.
}

message GetRequiredPluginsResponse {
    repeated PluginDependency plugins = 1; // a list of plugins required by this program.
}

// RunRequest asks the interpreter to execute a program.
message RunRequest {
    string project = 1;             // the project name.
    string stack = 2;               // the name of the stack being deployed into.
    string pwd = 3;                 // the program's working directory.
    string program = 4;             // the path to the program to execute.
    repeated string args = 5;       // any arguments to pass to the program.
    map<string, string> config = 6; // the configuration variables to apply before running.
    bool dryRun = 7;                // true if we're only doing a dryrun (preview).
    int32 parallel = 8;             // the degree of parallelism for resource operations (<=1 for serial).
    string monitor_address = 9;     // the address for communicating back to the resource monitor.
    bool queryMode = 10;     // true if we're only doing a query.
}

// RunResponse is the response back from the interpreter/source back to the monitor.
message RunResponse {
    // An unhandled error if any occurred.
    string error = 1;

    // An error happened.  And it was reported to the user.  Work should stop immediately
    // with nothing further to print to the user.  This corresponds to a "result.Bail()"
    // value in the 'go' layer.
    bool bail = 2;
}
