use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let out_dir = std::env::var("OUT_DIR")?;
let descriptor_path = format!("{out_dir}/stepflow_descriptor.bin");
let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR")?);
let proto_root = manifest_dir.join("proto");
let proto_root = dunce::canonicalize(&proto_root).expect("proto directory should exist");
let proto_root_str = proto_root.to_str().unwrap();
let proto_files: Vec<String> = [
"stepflow/v1/common.proto",
"stepflow/v1/health.proto",
"stepflow/v1/components.proto",
"stepflow/v1/tasks.proto",
"stepflow/v1/orchestrator.proto",
"stepflow/v1/blobs.proto",
"stepflow/v1/flows.proto",
"stepflow/v1/runs.proto",
"stepflow/v1/vsock.proto",
]
.iter()
.map(|p| proto_root.join(p).to_str().unwrap().to_string())
.collect();
let proto_file_refs: Vec<&str> = proto_files.iter().map(String::as_str).collect();
let include_dirs: &[&str] = &[proto_root_str];
let descriptor_bytes = tonic_rest_build::dump_file_descriptor_set(
&proto_file_refs,
include_dirs,
&descriptor_path,
);
let mut config = prost_build::Config::new();
config.file_descriptor_set_path(&descriptor_path);
config.extern_path(".google.protobuf.Value", "::prost_wkt_types::Value");
config.extern_path(".google.protobuf.Struct", "::prost_wkt_types::Struct");
config.extern_path(".google.protobuf.ListValue", "::prost_wkt_types::ListValue");
config.extern_path(".google.protobuf.Timestamp", "::prost_wkt_types::Timestamp");
config.extern_path(".google.protobuf.Duration", "::prost_wkt_types::Duration");
config.extern_path(".google.protobuf.Any", "::prost_wkt_types::Any");
config.extern_path(".google.protobuf.FieldMask", "::prost_wkt_types::FieldMask");
config.boxed(".stepflow.v1.TaskAssignment.task.execute");
tonic_rest_build::ProstSerdeConfig::new(&descriptor_bytes, &proto_file_refs).apply(&mut config);
config.type_attribute(
".stepflow.v1.TaskErrorCode",
"#[derive(schemars::JsonSchema)] #[serde(rename_all = \"SCREAMING_SNAKE_CASE\")]",
);
for msg in [
".stepflow.v1.GetRunRequest",
".stepflow.v1.GetRunStepsRequest",
".stepflow.v1.GetRunFlowRequest",
".stepflow.v1.GetRunItemsRequest",
".stepflow.v1.GetRunEventsRequest",
".stepflow.v1.GetStepDetailRequest",
".stepflow.v1.GetFlowRequest",
".stepflow.v1.GetFlowVariablesRequest",
".stepflow.v1.ListRunsRequest",
".stepflow.v1.ListComponentsRequest",
".stepflow.v1.ListRegisteredComponentsRequest",
".stepflow.v1.HealthCheckRequest",
".stepflow.v1.StoreFlowRequest",
".stepflow.v1.CreateRunRequest",
".stepflow.v1.DeleteRunRequest",
".stepflow.v1.DeleteFlowRequest",
".stepflow.v1.CancelRunRequest",
] {
config.message_attribute(msg, "#[serde(default)]");
}
tonic_prost_build::configure()
.build_server(true)
.build_client(true)
.compile_with_config(config, &proto_file_refs, include_dirs)?;
for proto in &proto_files {
println!("cargo:rerun-if-changed={proto}");
}
Ok(())
}