From b47bf6e05c34f3231a764090cccb41c5e3ded25a Mon Sep 17 00:00:00 2001 From: Amit Upadhyay Date: Sun, 8 Jun 2025 13:49:05 +0530 Subject: [PATCH 1/8] wip: ft_sdk::Required handles body better --- examples/auth-provider/Cargo.lock | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/examples/auth-provider/Cargo.lock b/examples/auth-provider/Cargo.lock index d397323..6c12429 100644 --- a/examples/auth-provider/Cargo.lock +++ b/examples/auth-provider/Cargo.lock @@ -208,15 +208,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - [[package]] name = "ft-derive" version = "0.2.1" @@ -241,7 +232,6 @@ dependencies = [ "rand_core 0.6.4", "serde", "serde_json", - "serde_urlencoded", "thiserror", "uuid", ] @@ -368,12 +358,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - [[package]] name = "proc-macro2" version = "1.0.93" @@ -463,18 +447,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "smallvec" version = "2.0.0-alpha.10" From 1312b863f03434da5d433588479de25e391f32e4 Mon Sep 17 00:00:00 2001 From: Amit Upadhyay Date: Sun, 8 Jun 2025 13:50:38 +0530 Subject: [PATCH 2/8] wip --- ft-sdk/src/from_request/handler.rs | 3 ++- ft-sdk/src/from_request/required.rs | 21 +++++++++++++++++++-- ft-sys/src/env.rs | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ft-sdk/src/from_request/handler.rs b/ft-sdk/src/from_request/handler.rs index 8a7a298..7865c3a 100644 --- a/ft-sdk/src/from_request/handler.rs +++ b/ft-sdk/src/from_request/handler.rs @@ -3,6 +3,7 @@ pub fn handle, ft_sdk::Error>>, H: Handler>( h: H, ) { + ft_sdk::println!("Handling request with handler"); let req = match current_request() { Ok(v) => v, Err(e) => { @@ -12,7 +13,7 @@ pub fn handle, ft_sdk::Error>>, H } }; let resp = h.call(&req).and_then(Into::into).unwrap_or_else(|e| { - ft_sdk::println!("Error: {:?}", e); + ft_sdk::println!("Error1: {:?}", e); ft_sdk::error::handle_error(e) }); ft_sdk::http::send_response(resp); diff --git a/ft-sdk/src/from_request/required.rs b/ft-sdk/src/from_request/required.rs index 25572a5..f4cac47 100644 --- a/ft-sdk/src/from_request/required.rs +++ b/ft-sdk/src/from_request/required.rs @@ -54,25 +54,42 @@ impl ft_sdk:: for Required { fn from_request(req: &http::Request) -> Result { - match req.body() { + ft_sdk::println!( + "Required<{}, {}>::from_request", + KEY, + std::any::type_name::() + ); + let r = match req.body() { serde_json::Value::Null => { + ft_sdk::println!("body is Null, expected Object"); Err(ft_sdk::single_error(KEY, "body is Null, expected Object").into()) } serde_json::Value::Object(map) => { + ft_sdk::println!("body is Object, checking for key: {}", KEY); if let Some(value) = map.get(KEY) { + ft_sdk::println!("found key: {}", KEY); if std::any::TypeId::of::() == std::any::TypeId::of::() { + ft_sdk::println!("type is String, checking if empty"); if let serde_json::Value::String(s) = value { if s.is_empty() { return Err(ft_sdk::single_error(KEY, "field is empty").into()); } } + } else { + ft_sdk::println!("type is not String"); + if let serde_json::Value::String(s) = value { + return Ok(serde_json::from_str(s).map(Required)?); + } } + ft_sdk::println!("deserializing {KEY}={value:?}"); Ok(serde_json::from_value(value.clone()).map(Required)?) } else { Err(ft_sdk::single_error(KEY, "missing field").into()) } } _ => Err(ft_sdk::single_error(KEY, "body is not json object").into()), - } + }; + ft_sdk::println!("r: {:?}", r.is_err()); + r } } diff --git a/ft-sys/src/env.rs b/ft-sys/src/env.rs index fde2043..e637c39 100644 --- a/ft-sys/src/env.rs +++ b/ft-sys/src/env.rs @@ -18,7 +18,7 @@ pub fn print_it(s: String) { #[doc(hidden)] #[cfg(not(target_family = "wasm"))] pub fn print_it(s: String) { - println!("{s}"); + println!("wasm: {s}"); } /// Print some data to the server log. From 02e264e2fbadadb36f70d09c907deea8fa45f29f Mon Sep 17 00:00:00 2001 From: siddhantCodes Date: Mon, 9 Jun 2025 15:44:11 +0530 Subject: [PATCH 3/8] minor: Remove unnecessary print stmts --- ft-sdk/src/from_request/handler.rs | 2 +- ft-sdk/src/from_request/required.rs | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/ft-sdk/src/from_request/handler.rs b/ft-sdk/src/from_request/handler.rs index 7865c3a..cba2397 100644 --- a/ft-sdk/src/from_request/handler.rs +++ b/ft-sdk/src/from_request/handler.rs @@ -13,7 +13,7 @@ pub fn handle, ft_sdk::Error>>, H } }; let resp = h.call(&req).and_then(Into::into).unwrap_or_else(|e| { - ft_sdk::println!("Error1: {:?}", e); + ft_sdk::println!("Error: {:?}", e); ft_sdk::error::handle_error(e) }); ft_sdk::http::send_response(resp); diff --git a/ft-sdk/src/from_request/required.rs b/ft-sdk/src/from_request/required.rs index f4cac47..db39731 100644 --- a/ft-sdk/src/from_request/required.rs +++ b/ft-sdk/src/from_request/required.rs @@ -54,12 +54,7 @@ impl ft_sdk:: for Required { fn from_request(req: &http::Request) -> Result { - ft_sdk::println!( - "Required<{}, {}>::from_request", - KEY, - std::any::type_name::() - ); - let r = match req.body() { + match req.body() { serde_json::Value::Null => { ft_sdk::println!("body is Null, expected Object"); Err(ft_sdk::single_error(KEY, "body is Null, expected Object").into()) @@ -76,20 +71,16 @@ impl ft_sdk:: } } } else { - ft_sdk::println!("type is not String"); if let serde_json::Value::String(s) = value { return Ok(serde_json::from_str(s).map(Required)?); } } - ft_sdk::println!("deserializing {KEY}={value:?}"); Ok(serde_json::from_value(value.clone()).map(Required)?) } else { Err(ft_sdk::single_error(KEY, "missing field").into()) } } _ => Err(ft_sdk::single_error(KEY, "body is not json object").into()), - }; - ft_sdk::println!("r: {:?}", r.is_err()); - r + } } } From 8508ccd7e5cd0f689fac8a4ac15904282cd9d278 Mon Sep 17 00:00:00 2001 From: siddhantCodes Date: Mon, 9 Jun 2025 15:51:54 +0530 Subject: [PATCH 4/8] minor: cargo fmt --- ft-sdk/src/auth/mod.rs | 2 +- ft-sdk/src/auth/utils.rs | 2 +- ft-sys/src/diesel_sqlite/bind_collector.rs | 2 +- ft-sys/src/diesel_sqlite/query_builder/insertable.rs | 2 +- ft-sys/src/diesel_sqlite/query_builder/returning.rs | 2 +- ft-sys/src/diesel_sqlite/types/mod.rs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ft-sdk/src/auth/mod.rs b/ft-sdk/src/auth/mod.rs index af45fae..efd5d73 100644 --- a/ft-sdk/src/auth/mod.rs +++ b/ft-sdk/src/auth/mod.rs @@ -5,7 +5,7 @@ mod utils; pub use ft_sys_shared::SESSION_KEY; pub use schema::fastn_user; -pub use utils::{user_data_by_query, Counter}; +pub use utils::{Counter, user_data_by_query}; #[derive(Clone, Debug)] pub struct UserId(pub i64); diff --git a/ft-sdk/src/auth/utils.rs b/ft-sdk/src/auth/utils.rs index 691eaef..c3f5cba 100644 --- a/ft-sdk/src/auth/utils.rs +++ b/ft-sdk/src/auth/utils.rs @@ -28,7 +28,7 @@ pub fn user_data_by_query( Ok(v) if v.len() > 1 => return Err(ft_sdk::auth::UserDataError::MultipleRowsFound), Ok(mut v) => v.pop().unwrap(), Err(diesel::result::Error::NotFound) => { - return Err(ft_sdk::auth::UserDataError::NoDataFound) + return Err(ft_sdk::auth::UserDataError::NoDataFound); } Err(e) => return Err(ft_sdk::auth::UserDataError::DatabaseError(e)), }; diff --git a/ft-sys/src/diesel_sqlite/bind_collector.rs b/ft-sys/src/diesel_sqlite/bind_collector.rs index dec030b..cfd1a81 100644 --- a/ft-sys/src/diesel_sqlite/bind_collector.rs +++ b/ft-sys/src/diesel_sqlite/bind_collector.rs @@ -1,7 +1,7 @@ +use diesel::QueryResult; use diesel::query_builder::BindCollector; use diesel::serialize::{IsNull, Output}; use diesel::sql_types::HasSqlType; -use diesel::QueryResult; use ft_sys::diesel_sqlite::backend::Sqlite; #[derive(Debug, Default, serde::Serialize)] diff --git a/ft-sys/src/diesel_sqlite/query_builder/insertable.rs b/ft-sys/src/diesel_sqlite/query_builder/insertable.rs index 11ea614..91a1cff 100644 --- a/ft-sys/src/diesel_sqlite/query_builder/insertable.rs +++ b/ft-sys/src/diesel_sqlite/query_builder/insertable.rs @@ -7,8 +7,8 @@ use diesel::query_builder::{AstPass, QueryId, ValuesClause}; use diesel::query_builder::{BatchInsert, InsertStatement}; use diesel::query_dsl::methods::ExecuteDsl; use diesel::{QueryResult, Table}; -use ft_sys::diesel_sqlite::Sqlite; use ft_sys::SqliteConnection; +use ft_sys::diesel_sqlite::Sqlite; // Todo: Add debug and display traits. // Checkout `diesel::query_builder::insert_statement::insert_with_default_for_sqlite` module diff --git a/ft-sys/src/diesel_sqlite/query_builder/returning.rs b/ft-sys/src/diesel_sqlite/query_builder/returning.rs index 871bee0..a101499 100644 --- a/ft-sys/src/diesel_sqlite/query_builder/returning.rs +++ b/ft-sys/src/diesel_sqlite/query_builder/returning.rs @@ -1,7 +1,7 @@ use diesel::query_builder::{AstPass, QueryFragment, ReturningClause}; use diesel::result::QueryResult; -use ft_sys::diesel_sqlite::backend::SqliteReturningClause; use ft_sys::diesel_sqlite::Sqlite; +use ft_sys::diesel_sqlite::backend::SqliteReturningClause; impl QueryFragment for ReturningClause where diff --git a/ft-sys/src/diesel_sqlite/types/mod.rs b/ft-sys/src/diesel_sqlite/types/mod.rs index 29d7907..082f1cb 100644 --- a/ft-sys/src/diesel_sqlite/types/mod.rs +++ b/ft-sys/src/diesel_sqlite/types/mod.rs @@ -5,7 +5,7 @@ mod jsonb; use super::{Sqlite, SqliteValue}; use diesel::deserialize::FromSql; use diesel::serialize::{IsNull, Output, ToSql}; -use diesel::{deserialize, serialize, sql_types, Queryable}; +use diesel::{Queryable, deserialize, serialize, sql_types}; impl FromSql for i32 { fn from_sql(value: SqliteValue) -> deserialize::Result { From a5ff408e01e93ed4e4725e382611c1d878649abb Mon Sep 17 00:00:00 2001 From: siddhantCodes Date: Mon, 9 Jun 2025 15:56:58 +0530 Subject: [PATCH 5/8] minor: cargo clippy --- ft-sdk/src/from_request/required.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ft-sdk/src/from_request/required.rs b/ft-sdk/src/from_request/required.rs index db39731..65e5a55 100644 --- a/ft-sdk/src/from_request/required.rs +++ b/ft-sdk/src/from_request/required.rs @@ -70,10 +70,8 @@ impl ft_sdk:: return Err(ft_sdk::single_error(KEY, "field is empty").into()); } } - } else { - if let serde_json::Value::String(s) = value { - return Ok(serde_json::from_str(s).map(Required)?); - } + } else if let serde_json::Value::String(s) = value { + return Ok(serde_json::from_str(s).map(Required)?); } Ok(serde_json::from_value(value.clone()).map(Required)?) } else { From c190b1f961bd57ba736496963383d6443a8a2e84 Mon Sep 17 00:00:00 2001 From: siddhantCodes Date: Mon, 9 Jun 2025 15:58:51 +0530 Subject: [PATCH 6/8] minor: fix tests --- ft-sdk/src/data.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ft-sdk/src/data.rs b/ft-sdk/src/data.rs index 41471eb..a3e73aa 100644 --- a/ft-sdk/src/data.rs +++ b/ft-sdk/src/data.rs @@ -112,7 +112,7 @@ pub fn binary>(content: bytes::Bytes, content_type: S) -> Result { /// Adding cookie with redirect headers does not work across browsers. This helper creates /// a 200-OK response, with an HTML meta-refresh tag to redirect the browser. /// -/// ```rust +/// ```rust,ignore /// let cookie = cookie::Cookie::build((ft_sdk::auth::SESSION_KEY, "some-uniq-key")) /// .domain("127.0.0.1") /// .path("") From 63543e4330500085899827ef3b6974e4146a0e43 Mon Sep 17 00:00:00 2001 From: Amit Upadhyay Date: Mon, 9 Jun 2025 17:50:34 +0530 Subject: [PATCH 7/8] minor comment --- ft-sdk/src/from_request/required.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ft-sdk/src/from_request/required.rs b/ft-sdk/src/from_request/required.rs index 65e5a55..b5c6987 100644 --- a/ft-sdk/src/from_request/required.rs +++ b/ft-sdk/src/from_request/required.rs @@ -71,6 +71,8 @@ impl ft_sdk:: } } } else if let serde_json::Value::String(s) = value { + // if the Rust type `T` is not String, and yet we have been passed a string, + // we can still deserialize it, just to be nice. return Ok(serde_json::from_str(s).map(Required)?); } Ok(serde_json::from_value(value.clone()).map(Required)?) From 577a20061132f35c2def6369c72c28b07b401fed Mon Sep 17 00:00:00 2001 From: Amit Upadhyay Date: Mon, 9 Jun 2025 17:53:54 +0530 Subject: [PATCH 8/8] changelog etc --- CHANGELOG.md | 7 +++++++ Cargo.lock | 2 +- Cargo.toml | 2 +- examples/auth-provider/Cargo.lock | 2 +- ft-sdk/Cargo.toml | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c893ef9..913a8f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # ChangeLog +## Unreleased + +### ft-sdk: 0.6.4 + +- `ft_sdk::Required`: if `T` is not `String` and incoming body is + `serde_json::Value::String`, we handle it still. + ## 22nd Mar 2025 ### ft-sdk: 0.6.3 diff --git a/Cargo.lock b/Cargo.lock index 667b398..974cf7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,7 +242,7 @@ dependencies = [ [[package]] name = "ft-sdk" -version = "0.6.3" +version = "0.6.4" dependencies = [ "anyhow", "bytes", diff --git a/Cargo.toml b/Cargo.toml index a0d2375..e9e4729 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ bytes = "1" chrono = { version = "0.4", default-features = false, features = ["serde"] } diesel = { version = "2.2.4", features = ["serde_json"] } ft-derive = { path = "ft-derive", version = "0.2.1" } -ft-sdk = { path = "ft-sdk", version = "0.6.3" } +ft-sdk = { path = "ft-sdk", version = "0.6.4" } ft-sys = { path = "ft-sys", version = "0.3.0" } ft-sys-shared = { path = "ft-sys-shared", version = "0.2.1" } http = "1" diff --git a/examples/auth-provider/Cargo.lock b/examples/auth-provider/Cargo.lock index 6c12429..d2190cc 100644 --- a/examples/auth-provider/Cargo.lock +++ b/examples/auth-provider/Cargo.lock @@ -218,7 +218,7 @@ dependencies = [ [[package]] name = "ft-sdk" -version = "0.6.3" +version = "0.6.4" dependencies = [ "anyhow", "bytes", diff --git a/ft-sdk/Cargo.toml b/ft-sdk/Cargo.toml index 902e229..424848c 100644 --- a/ft-sdk/Cargo.toml +++ b/ft-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ft-sdk" -version = "0.6.3" +version = "0.6.4" description = "ft-sdk: SDK for building FifthTry Applications" authors.workspace = true edition.workspace = true