syntax = "proto2";

package mediapipe;

import "mediapipe/framework/calculator.proto";
import "mediapipe/framework/calculator_options.proto";
import "mediapipe/framework/deps/proto_descriptor.proto";

option java_package = "com.google.mediapipe.proto";
option java_outer_classname = "GraphTemplateProto";

// A template rule or a template rule argument expression.
message TemplateExpression {
  // A template parameter name or a literal value.
  optional string param = 1;

  // A template rule operation or a template expression operation.
  optional string op = 2;

  // Nested template expressions, which define the operation args.
  // TODO: Rename this field to avoid collision with TemplateDict::arg.
  repeated TemplateExpression arg = 3;

  // The path within the protobuf to the modified field values.
  optional string path = 4;

  // The FieldDescriptor::Type of the modified field.
  optional mediapipe.FieldDescriptorProto.Type field_type = 5;

  // The FieldDescriptor::Type of each map key in the path.
  repeated mediapipe.FieldDescriptorProto.Type key_type = 6;

  // Alternative value for the modified field, in protobuf binary format.
  optional string field_value = 7;
}

// A protobuf extension defining a list of template rules.
message CalculatorGraphTemplate {
  // The base configuration.
  optional CalculatorGraphConfig config = 1;

  // The list of template rules.
  repeated TemplateExpression rule = 2;
}

// The value for a template parameter.
// The value can be either a simple value, a dictionary, or a list.
message TemplateArgument {
  oneof param_value {
    // A string value for the parameter.
    string str = 1;
    // A numeric value for the parameter.
    double num = 2;
    // A dictionary of values for the parameter.
    TemplateDict dict = 3;
  }
  // An ordered list of values for the parameter.
  repeated TemplateArgument element = 4;
}

// A dictionary of parameter values.
message TemplateDict {
  message Parameter {
    optional string key = 1;
    optional TemplateArgument value = 2;
  }
  // A map from parameter name to parameter value.
  repeated Parameter arg = 1;
}

// Options for a mediapipe template subgraph consisting of
// mediapipe template arguments.
message TemplateSubgraphOptions {
  extend mediapipe.CalculatorOptions {
    optional TemplateSubgraphOptions ext = 172998261;
  }

  // The template arguments used to expand the template for the subgraph.
  optional TemplateDict dict = 1;
}
