110 lines
2.7 KiB
Rust
110 lines
2.7 KiB
Rust
use clap::{Args,Parser,Subcommand};
|
|
|
|
#[derive(Parser)]
|
|
#[command(author,version,about,long_about=None)]
|
|
#[command(propagate_version=true)]
|
|
struct Cli{
|
|
#[command(subcommand)]
|
|
command:Commands,
|
|
}
|
|
|
|
#[derive(Subcommand)]
|
|
enum Commands{
|
|
Review(ReviewCommand),
|
|
}
|
|
|
|
#[derive(Args)]
|
|
struct ReviewCommand{
|
|
#[arg(long)]
|
|
cookie:String,
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main(){
|
|
let cli=Cli::parse();
|
|
match cli.command{
|
|
Commands::Review(command)=>review(ReviewConfig{
|
|
cookie:command.cookie,
|
|
}).await.unwrap(),
|
|
}
|
|
}
|
|
|
|
enum ScriptActionParseResult{
|
|
Pass,
|
|
Block,
|
|
Exit,
|
|
Delete,
|
|
}
|
|
struct ParseScriptActionErr;
|
|
impl std::str::FromStr for ScriptActionParseResult{
|
|
type Err=ParseScriptActionErr;
|
|
fn from_str(s:&str)->Result<Self,Self::Err>{
|
|
match s{
|
|
"pass\n"=>Ok(Self::Pass),
|
|
"block\n"=>Ok(Self::Block),
|
|
"exit\n"=>Ok(Self::Exit),
|
|
"delete\n"=>Ok(Self::Delete),
|
|
_=>Err(ParseScriptActionErr),
|
|
}
|
|
}
|
|
}
|
|
#[derive(Debug)]
|
|
enum ReviewError{
|
|
Cookie(submissions_api::CookieError),
|
|
Reqwest(submissions_api::ReqwestError),
|
|
GetPolicies(submissions_api::Error),
|
|
GetScriptFromHash(submissions_api::types::SingleItemError),
|
|
NoScript,
|
|
WriteCurrent(std::io::Error),
|
|
ActionIO(std::io::Error),
|
|
ReadCurrent(std::io::Error),
|
|
}
|
|
|
|
struct ReviewConfig{
|
|
cookie:String,
|
|
}
|
|
|
|
async fn review(config:ReviewConfig)->Result<(),ReviewError>{
|
|
// download unreviewed policies
|
|
// review them
|
|
let cookie=submissions_api::Cookie::new(&config.cookie).map_err(ReviewError::Cookie)?;
|
|
let api=submissions_api::external::Context::new("http://localhost:8083".to_owned(),cookie).map_err(ReviewError::Reqwest)?;
|
|
|
|
let unreviewed_policies=api.get_script_policies(submissions_api::types::GetScriptPoliciesRequest{
|
|
Page:1,
|
|
Limit:100,
|
|
FromScriptHash:None,
|
|
ToScriptID:None,
|
|
Policy:Some(submissions_api::types::Policy::None),
|
|
}).await.map_err(ReviewError::GetPolicies)?;
|
|
|
|
for unreviewed_policy in unreviewed_policies{
|
|
// download source code
|
|
let script_response=api.get_script_from_hash(submissions_api::types::HashRequest{
|
|
hash:unreviewed_policy.FromScriptHash.as_str(),
|
|
}).await
|
|
.map_err(ReviewError::GetScriptFromHash)?
|
|
.ok_or(ReviewError::NoScript)?;
|
|
|
|
let source=script_response.Source;
|
|
//load source into current.lua
|
|
tokio::fs::write("current.lua",source.as_str()).await.map_err(ReviewError::WriteCurrent)?;
|
|
|
|
//prompt action in terminal
|
|
//wait for input
|
|
let script_action;
|
|
loop{
|
|
print!("action: ");
|
|
std::io::Write::flush(&mut std::io::stdout()).map_err(ReviewError::ActionIO)?;
|
|
let mut action_string=String::new();
|
|
std::io::stdin().read_line(&mut action_string).map_err(ReviewError::ActionIO)?;
|
|
if let Ok(parsed_script_action)=action_string.parse::<ScriptActionParseResult>(){
|
|
script_action=parsed_script_action;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|