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 d397323..d2190cc 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" @@ -227,7 +218,7 @@ dependencies = [ [[package]] name = "ft-sdk" -version = "0.6.3" +version = "0.6.4" dependencies = [ "anyhow", "bytes", @@ -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" 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 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-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("") diff --git a/ft-sdk/src/from_request/handler.rs b/ft-sdk/src/from_request/handler.rs index 8a7a298..cba2397 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) => { diff --git a/ft-sdk/src/from_request/required.rs b/ft-sdk/src/from_request/required.rs index 25572a5..b5c6987 100644 --- a/ft-sdk/src/from_request/required.rs +++ b/ft-sdk/src/from_request/required.rs @@ -56,16 +56,24 @@ impl ft_sdk:: fn from_request(req: &http::Request) -> Result { 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 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)?) } else { 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 { 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.