From 742f7b4ec05da98cf028f459e18d34003663704e Mon Sep 17 00:00:00 2001 From: Jeft <67933106+Jeftaei@users.noreply.github.com> Date: Wed, 13 Sep 2023 09:13:23 -0500 Subject: [PATCH] we Love errors --- src/error.rs | 21 +++++++++++++++++++++ src/main.rs | 37 +++++++++++++++++++++++-------------- src/prelude.rs | 19 +++++++++++++++++++ 3 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 src/error.rs create mode 100644 src/prelude.rs diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..eac6475 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,21 @@ +#[derive(Debug)] +pub struct Error { + pub message: String, +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{}", self.message) + } +} + +impl std::error::Error for Error {} + +impl Error { + // has to be Box to fit with the result in prelude.rs + pub fn new(message: &str) -> Box { + Box::new(Self { + message: message.to_string(), + }) + } +} diff --git a/src/main.rs b/src/main.rs index a8c37a8..33346fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,14 @@ use std::unimplemented; use clap::{Args, Parser, Subcommand}; +mod error; +mod prelude; + +// this * means we are importing everything from the prelude module and in turn we overwrite the default `Result` with our own +// if you want the original back you can use StdResult or just std::result::Result +// using the new result also means the error type is implicitly Box (works for any errors that implement the std::error::Error trait) +use crate::prelude::*; + #[derive(Parser)] #[command(author, version, about, long_about = None)] #[command(propagate_version = true)] @@ -87,7 +95,7 @@ fn get_script_refs(dom:&rbx_dom_weak::WeakDom) -> Vec{ scripts } -fn get_id() -> Result>{ +fn get_id() -> Result{ match std::fs::read_to_string("id"){ Ok(id_file)=>Ok(id_file.parse::()?), Err(e) => match e.kind() { @@ -97,7 +105,7 @@ fn get_id() -> Result>{ } } -fn get_set_from_file(file:&str) -> Result, Box>{ +fn get_set_from_file(file:&str) -> Result>{ let mut set=std::collections::HashSet::::new(); for entry in std::fs::read_dir(file)? { set.insert(std::fs::read_to_string(entry?.path())?); @@ -105,15 +113,15 @@ fn get_set_from_file(file:&str) -> Result, Box Ok(set) } -fn get_allowed_set() -> Result, Box>{ +fn get_allowed_set() -> Result>{ get_set_from_file("scripts/allowed") } -fn get_blocked() -> Result, Box>{ +fn get_blocked() -> Result>{ get_set_from_file("scripts/blocked") } -fn get_allowed_map() -> Result, Box>{ +fn get_allowed_map() -> Result>{ let mut allowed_map = std::collections::HashMap::::new(); for entry in std::fs::read_dir("scripts/allowed")? { let entry=entry?; @@ -122,7 +130,7 @@ fn get_allowed_map() -> Result, Box Result, Box>{ +fn get_replace_map() -> Result>{ let mut replace = std::collections::HashMap::::new(); for entry in std::fs::read_dir("scripts/replace")? { let entry=entry?; @@ -135,7 +143,7 @@ fn check_source_illegal_keywords(source:&String)->bool{ source.find("getfenv").is_some()||source.find("require").is_some() } -fn download(map_list: Vec) -> Result<(), Box>{ +fn download(map_list: Vec) -> Result<()>{ let header=format!("Cookie: .ROBLOSECURITY={}",std::env::var("RBXCOOKIE")?); let shared_args=&[ "-q", @@ -158,7 +166,8 @@ enum Scan{ Blocked, Flagged, } -fn scan() -> Result<(), Box>{ + +fn scan() -> Result<()>{ let mut id = get_id()?; //Construct allowed scripts let allowed_set = get_allowed_set()?; @@ -216,7 +225,7 @@ fn scan() -> Result<(), Box>{ std::fs::write("id",id.to_string())?; Ok(()) } -fn extract(file_id:u64) -> Result<(), Box>{ +fn extract(file_id:u64) -> Result<()>{ let mut id = 0; //Construct allowed scripts let mut script_set = std::collections::HashSet::::new(); @@ -256,7 +265,7 @@ fn extract(file_id:u64) -> Result<(), Box>{ println!("extracted {} {}",id,if id==1 {"script"}else{"scripts"}); Ok(()) } -fn replace() -> Result<(), Box>{ +fn replace() -> Result<()>{ let allowed_map=get_allowed_map()?; let replace_map=get_replace_map()?; @@ -304,7 +313,7 @@ fn replace() -> Result<(), Box>{ } Ok(()) } -fn upload() -> Result<(), Box>{ +fn upload() -> Result<()>{ //interactive prompt per upload: //Creator: [auto fill creator] //DisplayName: [auto fill DisplayName] @@ -339,7 +348,7 @@ enum ScriptActionParseResult { struct ParseScriptActionErr; impl std::str::FromStr for ScriptActionParseResult { type Err=ParseScriptActionErr; - fn from_str(s: &str) -> Result{ + fn from_str(s: &str) -> StdResult{ if s=="pass\n"||s=="1\n"{ Ok(Self::Pass) }else if s=="block\n"{ @@ -354,7 +363,7 @@ impl std::str::FromStr for ScriptActionParseResult { } } -fn interactive() -> Result<(), Box>{ +fn interactive() -> Result<()>{ let mut id=get_id()?; //Construct allowed scripts let mut allowed_set=get_allowed_set()?; @@ -519,7 +528,7 @@ fn interactive() -> Result<(), Box>{ Ok(()) } -fn main() -> Result<(), Box> { +fn main() -> Result<()> { let cli = Cli::parse(); match cli.command { Commands::Download(map_list)=>download(map_list.maps), diff --git a/src/prelude.rs b/src/prelude.rs new file mode 100644 index 0000000..3f69da4 --- /dev/null +++ b/src/prelude.rs @@ -0,0 +1,19 @@ +pub use crate::error::Error; + +pub type Result = std::result::Result>; +pub type StdResult = std::result::Result; + +// i just wanted to mess around with macros a bit +// so heres labelprint as a macro +#[macro_export] +macro_rules! lprint { + ($expr:expr) => { + let ___this_file = std::file!(); + let ___line = std::line!(); + // let ___column = column!(); + println!("[{}:{}] {}", ___this_file, ___line, $expr); + }; + ($expr:expr, $($arg:tt)*) => { + lprint!(format!($expr, $($arg)*)); + }; +}