2024-12-21 22:35:43 -08:00

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(())
}