diff --git a/src/helper.rs b/src/helper.rs index 7700334..6540e41 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -5,8 +5,8 @@ use rustyline::validate::Validator; use rustyline::{Context, Helper, Result}; const BUILTINS: &[&str] = &[ - "GET", "POST", "PUT", "DELETE", "base", "header", "exit", "help", "history", "rerun", "set", - "unset", "save", "run", "vars", "headers", "requests", + "GET", "POST", "PUT", "PATCH", "DELETE", "base", "header", "exit", "help", "history", "rerun", + "set", "unset", "save", "run", "vars", "headers", "requests", ]; pub struct ShellHelper; diff --git a/src/parser.rs b/src/parser.rs index 0db700c..7ac0750 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -19,7 +19,7 @@ pub fn parse(input: String) -> Result { let token_match = tokens[0].to_lowercase(); match token_match.as_str() { - "get" | "post" | "put" | "delete" => { + "get" | "post" | "put" | "patch" | "delete" => { let result = parse_request(input)?; Ok(Parsed::Request(result)) } @@ -32,7 +32,7 @@ pub fn parse(input: String) -> Result { "exit" => Ok(Parsed::Exit), - _ => Err(format!("Reference Error: {} not defined", tokens[0])), + _ => Err(format!("Unknown command: {} not defined", tokens[0])), } } diff --git a/src/request.rs b/src/request.rs index 3c85059..074e49e 100644 --- a/src/request.rs +++ b/src/request.rs @@ -38,6 +38,7 @@ pub enum Method { GET, POST, PUT, + PATCH, DELETE, } @@ -47,6 +48,7 @@ impl Method { Method::GET => "GET", Method::POST => "POST", Method::PUT => "PUT", + Method::PATCH => "PATCH", Method::DELETE => "DELETE", } } diff --git a/src/runner.rs b/src/runner.rs index 0db65a9..5aef6f9 100644 --- a/src/runner.rs +++ b/src/runner.rs @@ -39,27 +39,30 @@ pub fn fetch( Method::GET => client.get(full_url), Method::POST => client.post(full_url), Method::PUT => client.put(full_url), + Method::PATCH => client.patch(full_url), Method::DELETE => client.delete(full_url), }; //Global Headers let mut headers = HeaderMap::new(); for (key, value) in global_headers { - headers.insert( - HeaderName::from_bytes(key.to_ascii_lowercase().as_bytes()).unwrap(), - HeaderValue::from_bytes(value.as_bytes()).unwrap(), - ); + let name = HeaderName::from_bytes(key.to_ascii_lowercase().as_bytes()) + .map_err(|_| format!("Invalid header name: {key}"))?; + let val = HeaderValue::from_bytes(value.as_bytes()) + .map_err(|_| format!("Invalid header value for '{key}': {value}"))?; + headers.insert(name, val); } // Request Headers for (key, value) in &request.headers { - headers.insert( - HeaderName::from_bytes(key.to_ascii_lowercase().as_bytes()).unwrap(), - HeaderValue::from_bytes(value.as_bytes()).unwrap(), - ); + let name = HeaderName::from_bytes(key.to_ascii_lowercase().as_bytes()) + .map_err(|_| format!("Invalid header name: {key}"))?; + let val = HeaderValue::from_bytes(value.as_bytes()) + .map_err(|_| format!("Invalid header value for '{key}': {value}"))?; + headers.insert(name, val); } if !headers.contains_key(CONTENT_TYPE) { - headers.insert(CONTENT_TYPE, "application/json".parse().unwrap()); + headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json")); } req_builder = req_builder.headers(headers);