From ca41a14a8b1d0bd9bd7051794a3f773618bf8541 Mon Sep 17 00:00:00 2001 From: kyhtonllk Date: Wed, 14 Feb 2024 11:46:15 +0400 Subject: [PATCH] Update With Clap and first release (I think so) --- Cargo.lock | 144 +++++++++++++++++++++-- Cargo.toml | 6 +- fastreq.png | Bin 68763 -> 0 bytes src/api_client.rs | 14 +-- src/main.rs | 188 ++++++++++++++---------------- src/{api.rs => v01_api_client.rs} | 34 +++++- src/v01_main.rs | 132 +++++++++++++++++++++ 7 files changed, 388 insertions(+), 130 deletions(-) delete mode 100644 fastreq.png rename src/{api.rs => v01_api_client.rs} (52%) create mode 100644 src/v01_main.rs diff --git a/Cargo.lock b/Cargo.lock index 5808896..ab76cd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,54 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "anstream" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -83,6 +131,62 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -130,6 +234,18 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "fastreq" +version = "0.1.0" +dependencies = [ + "clap", + "colored", + "reqwest", + "serde", + "serde_json", + "tokio", +] + [[package]] name = "fnv" version = "1.0.7" @@ -230,6 +346,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.5" @@ -615,16 +737,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "rust_http_client" -version = "0.1.0" -dependencies = [ - "reqwest", - "serde", - "serde_json", - "tokio", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -774,6 +886,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "syn" version = "2.0.48" @@ -956,6 +1074,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "vcpkg" version = "0.2.15" diff --git a/Cargo.toml b/Cargo.toml index b5e381f..3409233 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,13 @@ [package] -name = "rust_http_client" +name = "fastreq" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +clap = { version = "4.5.0", features = ["derive"] } +colored = "2" diff --git a/fastreq.png b/fastreq.png deleted file mode 100644 index 68682cf49f7f89601507c304d159836f938f7b57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68763 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

0w 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 Result { let client = Client::new(); - let request_builder = match method { - "1" => client.get(url), - "2" => { + let request_builder = match method.to_lowercase().as_str() { + "g" => client.get(url), + "p" => { let json_body: Value = serde_json::from_str(body.unwrap_or("{}")).expect("Invalid JSON body"); client.post(url).json(&json_body) } - "3" => client.put(url).body(body.unwrap_or_default().to_string()), - "4" => client.patch(url).body(body.unwrap_or_default().to_string()), + "put" => client.put(url).body(body.unwrap_or_default().to_string()), + "patch" => client.patch(url).body(body.unwrap_or_default().to_string()), _ => unimplemented!("This method is not supported"), }; request_builder.headers(headers).send().await } -pub fn read_json_file(file_path: &Path) -> std::io::Result { - fs::read_to_string(file_path) -} - pub fn parse_headers(headers_json: &Value) -> Result> { let mut headers = HeaderMap::new(); if let Value::Object(map) = headers_json { diff --git a/src/main.rs b/src/main.rs index b131811..797eedc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,127 +1,111 @@ mod api_client; -use api_client::{make_request, parse_headers, read_config, read_json_file}; +use api_client::{make_request, parse_headers, read_config}; +use clap::Parser; +use colored::Colorize; use reqwest::header::HeaderMap; -use serde_json::{json, Value}; -use std::{io, path::Path}; +use serde_json::Value; +use std::{fs, path::Path}; use tokio::runtime::Runtime; +#[derive(Parser, Debug)] +#[clap(author = "kythonlk", version = "0.1", about = "Api clients run in terminal simplified same as httpie but you can give pre fixes headers and urls etc.", long_about = None , after_help = "EXAMPLE:\n ex 1: fastreq -u 'http://example.com' -t g -b body.json -H headers.json -m \n ex 2: fastreq -c custom_config -t g -b body.json -H head.json -m")] +struct Args { + /// URL to request (leave blank to use URL from config file and you can also give different config file) + #[clap(short = 'u', long = "url")] + url: Option, + + /// Path to the configuration file + #[clap(short = 'c', long = "config", default_value = "config.json")] + config: String, + + /// HTTP request type (GET : g , POST : p , PUT : put, PATCH : patch) + #[clap(short = 't', long = "type")] + request_type: String, + + /// Path to the JSON body file + #[clap(short = 'b', long = "body")] + body_file: Option, + + /// Path to the JSON headers file + #[clap(short = 'H', long = "headers")] + headers_file: Option, + + /// Measure and print the time taken for the request + #[clap(short = 'm', long = "time")] + measure_time: bool, +} + fn main() { + println!( + "{} , {}", + "FASTREQ CLI".bold().blue().italic(), + "version 0.1".green().italic() + ); + println!( + "{}", + "fast and simple http client with workspace feature" + .italic() + .purple() + ); + + let args = Args::parse(); let runtime = Runtime::new().unwrap(); - println!("Enter the URL (or leave blank to use URL from config.json):"); - let mut url_input = String::new(); - io::stdin() - .read_line(&mut url_input) - .expect("Failed to read line"); - let url_input = url_input.trim(); - - println!("Select the request type:"); - println!("1: GET"); - println!("2: POST"); - println!("3: PUT"); - println!("4: PATCH"); - let mut method = String::new(); - io::stdin() - .read_line(&mut method) - .expect("Failed to read line"); - let method = method.trim(); - - let body: Option = if ["2", "3", "4"].contains(&method) { - println!("Enter the path to the JSON body file (e.g., body.json):"); - let mut body_file_path = String::new(); - io::stdin() - .read_line(&mut body_file_path) - .expect("Failed to read line"); - let body_file_path = Path::new(body_file_path.trim()); - match read_json_file(body_file_path) { - Ok(content) => Some(content), - Err(e) => { - eprintln!("Failed to read JSON body file: {}", e); - return; - } - } - } else { - None - }; + let config = read_config(Path::new(&args.config)).expect("Failed to read config"); + let final_url = args.url.unwrap_or_else(|| config.url); - let mut headers = HeaderMap::new(); - println!("Do you want to add headers from a file? (y/n):"); - let mut decision = String::new(); - io::stdin() - .read_line(&mut decision) - .expect("Failed to read line"); - if decision.trim().eq_ignore_ascii_case("y") { - println!("Enter the path to the JSON headers file (e.g., headers.json):"); - let mut headers_file_path = String::new(); - io::stdin() - .read_line(&mut headers_file_path) - .expect("Failed to read line"); - let headers_file_path = Path::new(headers_file_path.trim()); - let headers_json = match read_json_file(headers_file_path) { - Ok(content) => content, - Err(e) => { - eprintln!("Failed to read JSON headers file: {}", e); - return; - } - }; + let body = args + .body_file + .as_ref() + .map(|path| fs::read_to_string(path).expect("Failed to read JSON body file")); - let headers_value: Value = match serde_json::from_str(&headers_json) { - Ok(value) => value, - Err(e) => { - eprintln!("Failed to parse headers JSON: {}", e); - return; - } - }; + let headers = if let Some(headers_file) = args.headers_file.as_ref() { + let headers_json = + fs::read_to_string(headers_file).expect("Failed to read JSON headers file"); + let headers_value: Value = + serde_json::from_str(&headers_json).expect("Failed to parse headers JSON"); + parse_headers(&headers_value).expect("Failed to parse headers") + } else { + HeaderMap::new() + }; - headers = match parse_headers(&headers_value) { - Ok(parsed_headers) => parsed_headers, - Err(e) => { - eprintln!("Failed to parse headers: {}", e); - return; - } - }; - } + println!("Making a {} request to: {}", args.request_type, final_url); - let final_url = if url_input.is_empty() { - let config = match read_config(Path::new("config.json")) { - Ok(cfg) => cfg, - Err(e) => { - eprintln!("Failed to read config: {}", e); - return; - } - }; - config.url + if args.measure_time { + let start = std::time::Instant::now(); + let result = runtime.block_on(make_request( + &final_url, + &args.request_type, + body.as_deref(), + headers, + )); + let elapsed = start.elapsed(); + println!("Request completed in: {:?}", elapsed); + handle_response(result); } else { - url_input.to_string() - }; + let result = runtime.block_on(make_request( + &final_url, + &args.request_type, + body.as_deref(), + headers, + )); + handle_response(result); + } +} - println!("Making a {} request to: {}", method, final_url); - - // match runtime.block_on(make_request(&final_url, method, body.as_deref(), headers)) { - // Ok(response) => { - // if response.status().is_success() { - // let body = runtime - // .block_on(response.text()) - // .expect("Failed to read response body"); - // println!("Response: {}", body); - // } else { - // println!("Request failed with status: {}", response.status()); - // } - // } - // Err(e) => println!("Request error: {}", e), - // } - - match runtime.block_on(make_request(&final_url, method, body.as_deref(), headers)) { +fn handle_response(result: Result) { + match result { Ok(response) => { if response.status().is_success() { + let runtime = Runtime::new().unwrap(); let body = runtime .block_on(response.text()) .expect("Failed to read response body"); match serde_json::from_str::(&body) { Ok(json) => println!("{}", serde_json::to_string_pretty(&json).unwrap()), - Err(_) => println!("Response: {}", body), // Fallback to raw body if not JSON + Err(_) => println!("Response: {}", body), } } else { println!("Request failed with status: {}", response.status()); diff --git a/src/api.rs b/src/v01_api_client.rs similarity index 52% rename from src/api.rs rename to src/v01_api_client.rs index 2ca7ed8..d0b6fef 100644 --- a/src/api.rs +++ b/src/v01_api_client.rs @@ -12,15 +12,31 @@ pub struct Config { pub headers: Value, } -pub async fn make_request(url: &str, headers: HeaderMap) -> Result { +pub async fn make_request( + url: &str, + method: &str, + body: Option<&str>, + headers: HeaderMap, +) -> Result { let client = Client::new(); - client.get(url).headers(headers).send().await + + let request_builder = match method { + "1" => client.get(url), + "2" => { + let json_body: Value = + serde_json::from_str(body.unwrap_or("{}")).expect("Invalid JSON body"); + client.post(url).json(&json_body) + } + "3" => client.put(url).body(body.unwrap_or_default().to_string()), + "4" => client.patch(url).body(body.unwrap_or_default().to_string()), + _ => unimplemented!("This method is not supported"), + }; + + request_builder.headers(headers).send().await } -pub fn read_config(file_path: &Path) -> std::io::Result { - let config_str = fs::read_to_string(file_path)?; - let config: Config = serde_json::from_str(&config_str)?; - Ok(config) +pub fn read_json_file(file_path: &Path) -> std::io::Result { + fs::read_to_string(file_path) } pub fn parse_headers(headers_json: &Value) -> Result> { @@ -37,3 +53,9 @@ pub fn parse_headers(headers_json: &Value) -> Result Result> { + let config_str = fs::read_to_string(file_path)?; + let config: Config = serde_json::from_str(&config_str)?; + Ok(config) +} diff --git a/src/v01_main.rs b/src/v01_main.rs new file mode 100644 index 0000000..b131811 --- /dev/null +++ b/src/v01_main.rs @@ -0,0 +1,132 @@ +mod api_client; + +use api_client::{make_request, parse_headers, read_config, read_json_file}; +use reqwest::header::HeaderMap; +use serde_json::{json, Value}; +use std::{io, path::Path}; +use tokio::runtime::Runtime; + +fn main() { + let runtime = Runtime::new().unwrap(); + + println!("Enter the URL (or leave blank to use URL from config.json):"); + let mut url_input = String::new(); + io::stdin() + .read_line(&mut url_input) + .expect("Failed to read line"); + let url_input = url_input.trim(); + + println!("Select the request type:"); + println!("1: GET"); + println!("2: POST"); + println!("3: PUT"); + println!("4: PATCH"); + let mut method = String::new(); + io::stdin() + .read_line(&mut method) + .expect("Failed to read line"); + let method = method.trim(); + + let body: Option = if ["2", "3", "4"].contains(&method) { + println!("Enter the path to the JSON body file (e.g., body.json):"); + let mut body_file_path = String::new(); + io::stdin() + .read_line(&mut body_file_path) + .expect("Failed to read line"); + let body_file_path = Path::new(body_file_path.trim()); + match read_json_file(body_file_path) { + Ok(content) => Some(content), + Err(e) => { + eprintln!("Failed to read JSON body file: {}", e); + return; + } + } + } else { + None + }; + + let mut headers = HeaderMap::new(); + println!("Do you want to add headers from a file? (y/n):"); + let mut decision = String::new(); + io::stdin() + .read_line(&mut decision) + .expect("Failed to read line"); + if decision.trim().eq_ignore_ascii_case("y") { + println!("Enter the path to the JSON headers file (e.g., headers.json):"); + let mut headers_file_path = String::new(); + io::stdin() + .read_line(&mut headers_file_path) + .expect("Failed to read line"); + let headers_file_path = Path::new(headers_file_path.trim()); + let headers_json = match read_json_file(headers_file_path) { + Ok(content) => content, + Err(e) => { + eprintln!("Failed to read JSON headers file: {}", e); + return; + } + }; + + let headers_value: Value = match serde_json::from_str(&headers_json) { + Ok(value) => value, + Err(e) => { + eprintln!("Failed to parse headers JSON: {}", e); + return; + } + }; + + headers = match parse_headers(&headers_value) { + Ok(parsed_headers) => parsed_headers, + Err(e) => { + eprintln!("Failed to parse headers: {}", e); + return; + } + }; + } + + let final_url = if url_input.is_empty() { + let config = match read_config(Path::new("config.json")) { + Ok(cfg) => cfg, + Err(e) => { + eprintln!("Failed to read config: {}", e); + return; + } + }; + config.url + } else { + url_input.to_string() + }; + + println!("Making a {} request to: {}", method, final_url); + + // match runtime.block_on(make_request(&final_url, method, body.as_deref(), headers)) { + // Ok(response) => { + // if response.status().is_success() { + // let body = runtime + // .block_on(response.text()) + // .expect("Failed to read response body"); + // println!("Response: {}", body); + // } else { + // println!("Request failed with status: {}", response.status()); + // } + // } + // Err(e) => println!("Request error: {}", e), + // } + + match runtime.block_on(make_request(&final_url, method, body.as_deref(), headers)) { + Ok(response) => { + if response.status().is_success() { + let body = runtime + .block_on(response.text()) + .expect("Failed to read response body"); + + match serde_json::from_str::(&body) { + Ok(json) => println!("{}", serde_json::to_string_pretty(&json).unwrap()), + Err(_) => println!("Response: {}", body), // Fallback to raw body if not JSON + } + } else { + println!("Request failed with status: {}", response.status()); + } + } + Err(e) => println!("Request error: {}", e), + } +}