diff --git a/Cargo.toml b/Cargo.toml index 26c3363..8a176c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "google_bigquery_v2" -version = "0.2.4" +version = "0.2.5" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -9,7 +9,7 @@ edition = "2021" google-bigquery2 = "5.0.2" serde_json = "1.0.95" tokio = "1.0.2" -google_bigquery_v2_derive = { version = "0.0.1", path = "./google_bigquery_v2_derive" } +google_bigquery_v2_derive = { version = "0.0.2", path = "./google_bigquery_v2_derive" } chrono = "0.4.24" nameof = "1.2.2" env_logger = "0.10.0" diff --git a/google_bigquery_v2_derive/src/lib.rs b/google_bigquery_v2_derive/src/lib.rs index 36d856b..a151a8d 100644 --- a/google_bigquery_v2_derive/src/lib.rs +++ b/google_bigquery_v2_derive/src/lib.rs @@ -217,9 +217,8 @@ fn implement_set_field_value(ast: &DeriveInput) -> TokenStream { fn write_set_field_value(f: Field) -> TokenStream { let field_ident = f.field_ident; let local_name = f.local_name; - let field_type = f.ty; quote::quote! { - #local_name => self.#field_ident = #field_type::from_param(value)?, + #local_name => self.#field_ident = Self::from_param(value)?, } } let fields = get_fields_without_client(&ast.data); @@ -263,10 +262,9 @@ fn implement_get_field_value(ast: &DeriveInput) -> TokenStream { fn implement_from_query_result_row(ast: &DeriveInput) -> TokenStream { fn set_field_value(f: Field) -> TokenStream { let field_ident = f.field_ident; - let field_type = f.ty; let db_name = f.db_name; quote::quote! { - #field_ident: #field_type::from_param(&row[#db_name])?, + #field_ident: Self::from_param(&row[#db_name])?, } } let client_ident = get_client_field(&ast.data).field_ident; diff --git a/src/data/bigquery_table.rs b/src/data/bigquery_table.rs index 22017ca..97aa1a5 100644 --- a/src/data/bigquery_table.rs +++ b/src/data/bigquery_table.rs @@ -8,7 +8,9 @@ pub use google_bigquery2::api::{QueryParameterType, QueryParameterValue}; use serde_json::Value; use crate::client::BigqueryClient; -use crate::data::param_conversion::{convert_value_to_string, BigDataValueType}; +use crate::data::param_conversion::{ + convert_value_to_string, BigDataValueType, ConvertBigQueryParams, +}; use crate::data::query_builder::{ NoClient, NoStartingData, QueryBuilder, QueryResultType, QueryTypeDelete, QueryTypeInsert, QueryTypeNoType, QueryTypeSelect, QueryTypeUpdate, QueryWasNotBuilt, @@ -248,6 +250,23 @@ pub trait BigQueryTable: BigQueryTableBase { } Ok(()) } + + /// converts the value to Result by using T::from_param(value) + /// + /// this is basically just a wrapper so we don't need to know the type + /// of the field in the derive macro (or at least we don't need to write it) + /// like this: + /// + /// self.info1 = Option::::from_param(value)? + /// + /// instead we can just call: + /// + /// self.info1 = Self::from_param(value)?; + /// + /// and the types will be inferred + fn from_param(value: &Value) -> Result { + T::from_param(value) + } } impl BigQueryTable for T where T: BigQueryTableBase {} diff --git a/tests/tests.rs b/tests/tests.rs index 1017511..04c23e8 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,4 +1,3 @@ -use crate::prelude::*; use nameof::name_of; use google_bigquery_v2::data::query_builder::QueryResultType;