From 91df204b5cd03e5a8c8bea2b279aee6f822799be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pato=20Sanda=C3=B1a?= Date: Thu, 6 Mar 2025 11:57:35 -0300 Subject: [PATCH 1/4] Use all methods --- crates/crabapi/examples/multiple_requests.rs | 4 +-- crates/crabapi/examples/one_request.rs | 4 +-- crates/crabapi/src/cli/mod.rs | 5 ++-- crates/crabapi/src/core/requests.rs | 29 +++++++++++++++++--- crates/crabapi/src/gui/iced/mod.rs | 10 ++----- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/crates/crabapi/examples/multiple_requests.rs b/crates/crabapi/examples/multiple_requests.rs index 38cbc13..4a64df4 100644 --- a/crates/crabapi/examples/multiple_requests.rs +++ b/crates/crabapi/examples/multiple_requests.rs @@ -1,4 +1,4 @@ -use crabapi::core::requests::{build_request, send_requests}; +use crabapi::core::requests::{Url, build_request, send_requests}; use http::{HeaderMap, Method}; use reqwest::{Body, Client}; use std::collections::HashMap; @@ -16,7 +16,7 @@ async fn main() -> Result<(), Box> { headers.insert("key", i.to_string().parse().unwrap()); reqs.push(build_request( &client, - "http://localhost:7878", + Url::parse("http://localhost:7878").unwrap(), query, Method::POST, headers, diff --git a/crates/crabapi/examples/one_request.rs b/crates/crabapi/examples/one_request.rs index 8f79c6c..68cb808 100644 --- a/crates/crabapi/examples/one_request.rs +++ b/crates/crabapi/examples/one_request.rs @@ -1,4 +1,4 @@ -use crabapi::core::requests::{build_request, send_requests}; +use crabapi::core::requests::{Url, build_request, send_requests}; use http::{HeaderMap, Method}; use reqwest::{Body, Client}; use std::collections::HashMap; @@ -11,7 +11,7 @@ async fn main() -> Result<(), Box> { // send 1 request let req = build_request( &client, - "http://localhost:7878", + Url::parse("http://localhost:7878").unwrap(), HashMap::new(), Method::GET, HeaderMap::new(), diff --git a/crates/crabapi/src/cli/mod.rs b/crates/crabapi/src/cli/mod.rs index 8f05b6c..070ddc8 100644 --- a/crates/crabapi/src/cli/mod.rs +++ b/crates/crabapi/src/cli/mod.rs @@ -1,5 +1,5 @@ use crate::core::app::constants; -use crate::core::requests::{build_request, print_response, send_requests}; +use crate::core::requests::{Url, build_request, constants as requests_constants, print_response, send_requests}; use clap::{Arg, ArgAction, Command}; use const_format::formatcp; use http::{HeaderMap, HeaderName, HeaderValue, Method}; @@ -40,7 +40,7 @@ impl Cli { .short('X') .long("method") .value_name("METHOD") - .help("HTTP method(GET, POST, PUT, DELETE, OPTIONS)") + .help(formatcp!("HTTP method({})", requests_constants::ALL_METHODS_AS_STRING)) .default_value("GET"), headers_arg: Arg::new("headers") .short('H') @@ -98,6 +98,7 @@ impl Cli { .unwrap() .parse::()?; let url = matches.get_one::("url").unwrap(); + let url = Url::parse(url).unwrap(); let mut headers = HeaderMap::new(); if let Some(header_values) = matches.get_many::("headers") { diff --git a/crates/crabapi/src/core/requests.rs b/crates/crabapi/src/core/requests.rs index d534b67..4e45d1b 100644 --- a/crates/crabapi/src/core/requests.rs +++ b/crates/crabapi/src/core/requests.rs @@ -1,22 +1,43 @@ -use http::{HeaderMap, Method}; use reqwest::{Body, Client, Error, RequestBuilder, Response}; use std::collections::HashMap; use tokio::task::JoinHandle; +pub use http::{HeaderMap, Method}; +pub use reqwest::Url; + pub mod constants { - use const_format::formatcp; + use const_format::{concatcp, formatcp}; + use http::Method; pub const USER_AGENT: &str = formatcp!( "{} v{}", crate::core::app::constants::APP_NAME, crate::core::app::constants::APP_VERSION ); + + pub const METHODS: [Method; 9] = [ + Method::GET, + Method::POST, + Method::PUT, + Method::DELETE, + Method::HEAD, + Method::OPTIONS, + Method::CONNECT, + Method::PATCH, + Method::TRACE, + ]; + + pub const METHODS_STRING: [&str; 9] = [ + "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", + ]; + + pub const ALL_METHODS_AS_STRING: &str = "GET, POST, PUT, DELETE, HEAD, OPTIONS, CONNECT, PATCH, TRACE"; } // TODO: Implement params too pub fn build_request( client: &Client, - url: &str, + url: Url, query: HashMap, method: Method, headers: HeaderMap, @@ -25,7 +46,7 @@ pub fn build_request( let mut default_headers = HeaderMap::new(); default_headers.insert("User-Agent", constants::USER_AGENT.parse().unwrap()); - let request = reqwest::Request::new(method, url.parse().unwrap()); + let request = reqwest::Request::new(method, url); RequestBuilder::from_parts(client.clone(), request) .query(&query) .headers(default_headers) diff --git a/crates/crabapi/src/gui/iced/mod.rs b/crates/crabapi/src/gui/iced/mod.rs index 5edde3d..81484a1 100644 --- a/crates/crabapi/src/gui/iced/mod.rs +++ b/crates/crabapi/src/gui/iced/mod.rs @@ -2,7 +2,7 @@ use iced; use iced::Element; use iced::widget::{Column, column, combo_box, text, text_input}; -use http::Method; +use crate::core::requests::{Method, Url, constants}; pub fn init() { iced::run(GUI::title, GUI::update, GUI::view).unwrap() @@ -29,13 +29,7 @@ pub struct GUI { impl GUI { fn new() -> Self { Self { - methods: combo_box::State::new(vec![ - Method::GET, - Method::POST, - Method::PUT, - Method::DELETE, - Method::PATCH, - ]), + methods: combo_box::State::new(constants::METHODS.into()), method_selected: None, url_input: String::new(), // header_input: String::new(), From 957c8e421c3bf92071b6a2d09d78d5683253e976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pato=20Sanda=C3=B1a?= Date: Thu, 6 Mar 2025 13:13:51 -0300 Subject: [PATCH 2/4] parse url --- crates/crabapi/src/core/requests.rs | 2 +- crates/crabapi/src/gui/iced/mod.rs | 41 ++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/crates/crabapi/src/core/requests.rs b/crates/crabapi/src/core/requests.rs index 4e45d1b..606400d 100644 --- a/crates/crabapi/src/core/requests.rs +++ b/crates/crabapi/src/core/requests.rs @@ -6,7 +6,7 @@ pub use http::{HeaderMap, Method}; pub use reqwest::Url; pub mod constants { - use const_format::{concatcp, formatcp}; + use const_format::formatcp; use http::Method; pub const USER_AGENT: &str = formatcp!( diff --git a/crates/crabapi/src/gui/iced/mod.rs b/crates/crabapi/src/gui/iced/mod.rs index 81484a1..7699d6e 100644 --- a/crates/crabapi/src/gui/iced/mod.rs +++ b/crates/crabapi/src/gui/iced/mod.rs @@ -21,9 +21,10 @@ enum Message { pub struct GUI { methods: combo_box::State, method_selected: Option, - url_input: String, //http::Uri, - // header_input: String, //http::HeaderMap, - // body_input: String, //http::Body + url_input: String, + url_input_valid: bool, //http::Uri, + // header_input: String, //http::HeaderMap, + // body_input: String, //http::Body } impl GUI { @@ -32,6 +33,7 @@ impl GUI { methods: combo_box::State::new(constants::METHODS.into()), method_selected: None, url_input: String::new(), + url_input_valid: false, // header_input: String::new(), // body_input: String::new(), } @@ -47,7 +49,8 @@ impl GUI { self.method_selected = Some(method); } Message::UrlInputChanged(url) => { - self.url_input = url; //http::Uri::from_static("http://localhost:7878"); + self.url_input = url; + self.url_input_valid = GUI::is_valid_url(&self.url_input); } // Message::HeaderInputChanged(header) => { // self.header_input = header; // ttp::HeaderMap::new(); // } @@ -58,9 +61,22 @@ impl GUI { } fn view(&self) -> Element { + let url_input_icon = iced::widget::text_input::Icon { + font: iced::Font::default(), + code_point: if self.url_input_valid { '✅' } else { '❌' }, + size: Some(Self::input_size()), + spacing: 0.0, + side: iced::widget::text_input::Side::Right, + }; + let url_input = text_input("Url", &self.url_input) + .on_input(Message::UrlInputChanged) + // .padding(10) + .size(Self::input_size()) + .icon(url_input_icon); + column![ - GUI::label("Uri:"), - text_input("Uri", &self.url_input).on_input(Message::UrlInputChanged), + GUI::label("Url:"), + url_input, GUI::label("Method:"), combo_box( &self.methods, @@ -68,6 +84,7 @@ impl GUI { self.method_selected.as_ref(), Message::MethodChanged ) + .size(Self::input_size_as_f32()) ] .into() } @@ -75,6 +92,18 @@ impl GUI { fn label(label: &str) -> Column<'_, Message> { column![text(label)].spacing(10) } + + fn is_valid_url(url: &str) -> bool { + Url::parse(url).is_ok() + } + + const fn input_size_as_f32() -> f32 { + 20.0 + } + + const fn input_size() -> iced::Pixels { + iced::Pixels(Self::input_size_as_f32()) + } } impl Default for GUI { From 92f7cbdc51751a01cc2291028a406a38a40e98c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pato=20Sanda=C3=B1a?= Date: Thu, 6 Mar 2025 13:37:20 -0300 Subject: [PATCH 3/4] cargo fmt --- crates/crabapi/src/cli/mod.rs | 9 +++++++-- crates/crabapi/src/core/requests.rs | 3 ++- crates/crabapi/src/gui/iced/mod.rs | 5 +---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/crates/crabapi/src/cli/mod.rs b/crates/crabapi/src/cli/mod.rs index 070ddc8..0c5f31e 100644 --- a/crates/crabapi/src/cli/mod.rs +++ b/crates/crabapi/src/cli/mod.rs @@ -1,5 +1,7 @@ use crate::core::app::constants; -use crate::core::requests::{Url, build_request, constants as requests_constants, print_response, send_requests}; +use crate::core::requests::{ + Url, build_request, constants as requests_constants, print_response, send_requests, +}; use clap::{Arg, ArgAction, Command}; use const_format::formatcp; use http::{HeaderMap, HeaderName, HeaderValue, Method}; @@ -40,7 +42,10 @@ impl Cli { .short('X') .long("method") .value_name("METHOD") - .help(formatcp!("HTTP method({})", requests_constants::ALL_METHODS_AS_STRING)) + .help(formatcp!( + "HTTP method({})", + requests_constants::ALL_METHODS_AS_STRING + )) .default_value("GET"), headers_arg: Arg::new("headers") .short('H') diff --git a/crates/crabapi/src/core/requests.rs b/crates/crabapi/src/core/requests.rs index 606400d..a90aed7 100644 --- a/crates/crabapi/src/core/requests.rs +++ b/crates/crabapi/src/core/requests.rs @@ -31,7 +31,8 @@ pub mod constants { "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE", ]; - pub const ALL_METHODS_AS_STRING: &str = "GET, POST, PUT, DELETE, HEAD, OPTIONS, CONNECT, PATCH, TRACE"; + pub const ALL_METHODS_AS_STRING: &str = + "GET, POST, PUT, DELETE, HEAD, OPTIONS, CONNECT, PATCH, TRACE"; } // TODO: Implement params too diff --git a/crates/crabapi/src/gui/iced/mod.rs b/crates/crabapi/src/gui/iced/mod.rs index 7699d6e..7100dd0 100644 --- a/crates/crabapi/src/gui/iced/mod.rs +++ b/crates/crabapi/src/gui/iced/mod.rs @@ -22,9 +22,7 @@ pub struct GUI { methods: combo_box::State, method_selected: Option, url_input: String, - url_input_valid: bool, //http::Uri, - // header_input: String, //http::HeaderMap, - // body_input: String, //http::Body + url_input_valid: bool, } impl GUI { @@ -70,7 +68,6 @@ impl GUI { }; let url_input = text_input("Url", &self.url_input) .on_input(Message::UrlInputChanged) - // .padding(10) .size(Self::input_size()) .icon(url_input_icon); From a05e89de8c293010462daa39732e540bd8e88151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pato=20Sanda=C3=B1a?= Date: Thu, 6 Mar 2025 13:56:24 -0300 Subject: [PATCH 4/4] warnings as errors --- .cargo/config.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..4c75a70 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[build] +rustflags = ["-D", "warnings"] +rustdocflags = ["-D", "warnings"] \ No newline at end of file