220 lines
8.8 KiB
Rust
220 lines
8.8 KiB
Rust
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{
|
|
($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,"/{}/",$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)?
|
|
).await.map_err(Error::Response)?;
|
|
|
|
Ok(())
|
|
}
|
|
};
|
|
}
|
|
impl Context{
|
|
pub fn new(base_url:String)->reqwest::Result<Self>{
|
|
Ok(Self(crate::context::Context::new(base_url,None)?))
|
|
}
|
|
pub async fn get_script(&self,config:GetScriptRequest)->Result<ScriptResponse,Error>{
|
|
let url_raw=format!("{}/scripts/{}",self.0.base_url,config.ScriptID.0);
|
|
let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
response_ok(
|
|
self.0.get(url).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
pub async fn get_scripts(&self,config:GetScriptsRequest<'_>)->Result<Vec<ScriptResponse>,Error>{
|
|
let url_raw=format!("{}/scripts",self.0.base_url);
|
|
let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
{
|
|
let mut query_pairs=url.query_pairs_mut();
|
|
query_pairs.append_pair("Page",config.Page.to_string().as_str());
|
|
query_pairs.append_pair("Limit",config.Limit.to_string().as_str());
|
|
if let Some(name)=config.Name{
|
|
query_pairs.append_pair("Name",name);
|
|
}
|
|
if let Some(hash)=config.Hash{
|
|
query_pairs.append_pair("Hash",hash);
|
|
}
|
|
if let Some(source)=config.Source{
|
|
query_pairs.append_pair("Source",source);
|
|
}
|
|
if let Some(resource_type)=config.ResourceType{
|
|
query_pairs.append_pair("ResourceType",(resource_type as i32).to_string().as_str());
|
|
}
|
|
if let Some(resource_id)=config.ResourceID{
|
|
query_pairs.append_pair("ResourceID",resource_id.to_string().as_str());
|
|
}
|
|
}
|
|
|
|
response_ok(
|
|
self.0.get(url).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
pub async fn get_script_from_hash(&self,config:HashRequest<'_>)->Result<Option<ScriptResponse>,SingleItemError>{
|
|
let scripts=self.get_scripts(GetScriptsRequest{
|
|
Page:1,
|
|
Limit:2,
|
|
Hash:Some(config.hash),
|
|
Name:None,
|
|
Source:None,
|
|
ResourceType:None,
|
|
ResourceID:None,
|
|
}).await.map_err(SingleItemError::Other)?;
|
|
if 1<scripts.len(){
|
|
return Err(SingleItemError::DuplicateItems);
|
|
}
|
|
Ok(scripts.into_iter().next())
|
|
}
|
|
pub async fn create_script(&self,config:CreateScriptRequest<'_>)->Result<ScriptIDResponse,Error>{
|
|
let url_raw=format!("{}/scripts",self.0.base_url);
|
|
let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
let body=serde_json::to_string(&config).map_err(Error::JSON)?;
|
|
|
|
response_ok(
|
|
self.0.post(url,body).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
pub async fn get_script_policies(&self,config:GetScriptPoliciesRequest<'_>)->Result<Vec<ScriptPolicyResponse>,Error>{
|
|
let url_raw=format!("{}/script-policy",self.0.base_url);
|
|
let mut url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
{
|
|
let mut query_pairs=url.query_pairs_mut();
|
|
query_pairs.append_pair("Page",config.Page.to_string().as_str());
|
|
query_pairs.append_pair("Limit",config.Limit.to_string().as_str());
|
|
if let Some(hash)=config.FromScriptHash{
|
|
query_pairs.append_pair("FromScriptHash",hash);
|
|
}
|
|
if let Some(script_id)=config.ToScriptID{
|
|
query_pairs.append_pair("ToScriptID",script_id.0.to_string().as_str());
|
|
}
|
|
if let Some(policy)=config.Policy{
|
|
query_pairs.append_pair("Policy",(policy as i32).to_string().as_str());
|
|
}
|
|
}
|
|
|
|
response_ok(
|
|
self.0.get(url).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
pub async fn get_script_policy_from_hash(&self,config:HashRequest<'_>)->Result<Option<ScriptPolicyResponse>,SingleItemError>{
|
|
let policies=self.get_script_policies(GetScriptPoliciesRequest{
|
|
Page:1,
|
|
Limit:2,
|
|
FromScriptHash:Some(config.hash),
|
|
ToScriptID:None,
|
|
Policy:None,
|
|
}).await.map_err(SingleItemError::Other)?;
|
|
if 1<policies.len(){
|
|
return Err(SingleItemError::DuplicateItems);
|
|
}
|
|
Ok(policies.into_iter().next())
|
|
}
|
|
pub async fn create_script_policy(&self,config:CreateScriptPolicyRequest)->Result<ScriptPolicyIDResponse,Error>{
|
|
let url_raw=format!("{}/script-policy",self.0.base_url);
|
|
let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
let body=serde_json::to_string(&config).map_err(Error::JSON)?;
|
|
|
|
response_ok(
|
|
self.0.post(url,body).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
pub async fn create_submission(&self,config:CreateSubmissionRequest<'_>)->Result<SubmissionIDResponse,Error>{
|
|
let url_raw=format!("{}/submissions",self.0.base_url);
|
|
let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
let body=serde_json::to_string(&config).map_err(Error::JSON)?;
|
|
|
|
response_ok(
|
|
self.0.post(url,body).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
// simple submission endpoints
|
|
action!("submissions",action_submission_request_changes,config,ActionSubmissionRequestChangesRequest,"status/validator-request-changes",config.SubmissionID,
|
|
("ErrorMessage",config.ErrorMessage.as_str())
|
|
);
|
|
action!("submissions",action_submission_submitted,config,ActionSubmissionSubmittedRequest,"status/validator-submitted",config.SubmissionID,
|
|
("ModelVersion",config.ModelVersion.to_string().as_str())
|
|
("DisplayName",config.DisplayName.as_str())
|
|
("Creator",config.Creator.as_str())
|
|
("GameID",config.GameID.to_string().as_str())
|
|
);
|
|
action!("submissions",action_submission_validated,config,SubmissionID,"status/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,"status/validator-uploaded",config.SubmissionID,
|
|
("UploadedAssetID",config.UploadedAssetID.to_string().as_str())
|
|
);
|
|
action!("submissions",action_submission_accepted,config,ActionSubmissionAcceptedRequest,"status/validator-failed",config.SubmissionID,
|
|
("ErrorMessage",config.ErrorMessage.as_str())
|
|
);
|
|
pub async fn create_mapfix(&self,config:CreateMapfixRequest<'_>)->Result<MapfixIDResponse,Error>{
|
|
let url_raw=format!("{}/mapfixes",self.0.base_url);
|
|
let url=reqwest::Url::parse(url_raw.as_str()).map_err(Error::Parse)?;
|
|
|
|
let body=serde_json::to_string(&config).map_err(Error::JSON)?;
|
|
|
|
response_ok(
|
|
self.0.post(url,body).await.map_err(Error::Reqwest)?
|
|
).await.map_err(Error::Response)?
|
|
.json().await.map_err(Error::ReqwestJson)
|
|
}
|
|
// simple mapfixes endpoints
|
|
action!("mapfixes",action_mapfix_request_changes,config,ActionMapfixRequestChangesRequest,"status/validator-request-changes",config.MapfixID,
|
|
("ErrorMessage",config.ErrorMessage.as_str())
|
|
);
|
|
action!("mapfixes",action_mapfix_submitted,config,ActionMapfixSubmittedRequest,"status/validator-submitted",config.MapfixID,
|
|
("ModelVersion",config.ModelVersion.to_string().as_str())
|
|
("DisplayName",config.DisplayName.as_str())
|
|
("Creator",config.Creator.as_str())
|
|
("GameID",config.GameID.to_string().as_str())
|
|
);
|
|
action!("mapfixes",action_mapfix_validated,config,MapfixID,"status/validator-validated",config.0,);
|
|
action!("mapfixes",update_mapfix_validated_model,config,UpdateMapfixModelRequest,"validated-model",config.MapfixID,
|
|
("ValidatedModelID",config.ModelID.to_string().as_str())
|
|
("ValidatedModelVersion",config.ModelVersion.to_string().as_str())
|
|
);
|
|
action!("mapfixes",action_mapfix_uploaded,config,ActionMapfixUploadedRequest,"status/validator-uploaded",config.MapfixID,);
|
|
action!("mapfixes",action_mapfix_accepted,config,ActionMapfixAcceptedRequest,"status/validator-failed",config.MapfixID,
|
|
("ErrorMessage",config.ErrorMessage.as_str())
|
|
);
|
|
// simple operation endpoint
|
|
action!("operations",action_operation_failed,config,ActionOperationFailedRequest,"status/operation-failed",config.OperationID,
|
|
("StatusMessage",config.StatusMessage.as_str())
|
|
);
|
|
}
|