From cc7df064bea978b29bc94bfda8a7c17bff85c7c5 Mon Sep 17 00:00:00 2001
From: Quaternions <krakow20@gmail.com>
Date: Tue, 1 Apr 2025 13:19:17 -0700
Subject: [PATCH] submissions-api: deduplicate simple endpoints with crazy
 macro

---
 validation/api/src/internal.rs | 81 +++++++++++++---------------------
 1 file changed, 31 insertions(+), 50 deletions(-)

diff --git a/validation/api/src/internal.rs b/validation/api/src/internal.rs
index 990466d..0086767 100644
--- a/validation/api/src/internal.rs
+++ b/validation/api/src/internal.rs
@@ -3,12 +3,27 @@ use crate::types::*;
 #[derive(Clone)]
 pub struct Context(crate::context::Context);
 
+// conditionally include specified query pairs
+macro_rules! query_pairs{
+	($url:expr,)=>{
+		$url
+	};
+	($url:expr,$(($param:expr,$value:expr))+)=>{
+		{
+			let mut url=$url;
+			url.query_pairs_mut()
+				$(.append_pair($param,$value))*;
+			url
+		}
+	};
+}
+
 // there are lots of action endpoints and they all follow the same pattern
 macro_rules! action{
-	($fname:ident,$action:expr)=>{
-		pub async fn $fname(&self,config:SubmissionID)->Result<(),Error>{
-			let url_raw=format!(concat!("{}/submissions/{}/status/",$action),self.0.base_url,config.0);
-			let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
+	($system:expr,$fname:ident,$config:ident,$config_type:ident,$action:expr,$config_submission_id:expr,$(($param:expr,$value:expr))*)=>{
+		pub async fn $fname(&self,$config:$config_type)->Result<(),Error>{
+			let url_raw=format!(concat!("{}/",$system,"/{}/status/",$action),self.0.base_url,$config_submission_id);
+			let url=query_pairs!(reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?,$(($param,$value))*);
 
 			response_ok(
 				self.0.post_empty_body(url).await.map_err(Error::Reqwest)?
@@ -135,50 +150,16 @@ impl Context{
 		).await.map_err(Error::Response)?
 		.json().await.map_err(Error::ReqwestJson)
 	}
-	pub async fn update_submission_validated_model(&self,config:UpdateSubmissionModelRequest)->Result<(),Error>{
-		let url_raw=format!("{}/submissions/{}/validated-model",self.0.base_url,config.SubmissionID);
-		let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
-
-		{
-			url.query_pairs_mut()
-				.append_pair("ValidatedModelID",config.ModelID.to_string().as_str())
-				.append_pair("ValidatedModelVersion",config.ModelVersion.to_string().as_str());
-		}
-
-		response_ok(
-			self.0.post_empty_body(url).await.map_err(Error::Reqwest)?
-		).await.map_err(Error::Response)?;
-
-		Ok(())
-	}
-	pub async fn action_submission_uploaded(&self,config:ActionSubmissionUploadedRequest)->Result<(),Error>{
-		let url_raw=format!("{}/submissions/{}/status/validator-uploaded",self.0.base_url,config.SubmissionID);
-		let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
-
-		{
-			url.query_pairs_mut()
-				.append_pair("UploadedAssetID",config.UploadedAssetID.to_string().as_str());
-		}
-		response_ok(
-			self.0.post_empty_body(url).await.map_err(Error::Reqwest)?
-		).await.map_err(Error::Response)?;
-
-		Ok(())
-	}
-	pub async fn action_submission_accepted(&self,config:ActionSubmissionAcceptedRequest)->Result<(),Error>{
-		let url_raw=format!("{}/submissions/{}/status/validator-failed",self.0.base_url,config.SubmissionID);
-		let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
-
-		{
-			url.query_pairs_mut()
-				.append_pair("StatusMessage",config.StatusMessage.as_str());
-		}
-
-		response_ok(
-			self.0.post_empty_body(url).await.map_err(Error::Reqwest)?
-		).await.map_err(Error::Response)?;
-
-		Ok(())
-	}
-	action!(action_submission_validated,"validator-validated");
+	// simple submission endpoints
+	action!("submissions",action_submission_validated,config,SubmissionID,"validator-validated",config.0,);
+	action!("submissions",update_submission_validated_model,config,UpdateSubmissionModelRequest,"validated-model",config.SubmissionID,
+		("ValidatedModelID",config.ModelID.to_string().as_str())
+		("ValidatedModelVersion",config.ModelVersion.to_string().as_str())
+	);
+	action!("submissions",action_submission_uploaded,config,ActionSubmissionUploadedRequest,"validator-uploaded",config.SubmissionID,
+		("UploadedAssetID",config.UploadedAssetID.to_string().as_str())
+	);
+	action!("submissions",action_submission_accepted,config,ActionSubmissionAcceptedRequest,"validator-failed",config.SubmissionID,
+		("StatusMessage",config.StatusMessage.as_str())
+	);
 }