use mysql_common::frunk::{hlist_pat, HList}; use struct_field_names_as_array::FieldNamesAsArray; #[allow(non_snake_case)] #[derive(Debug, PartialEq, FieldNamesAsArray)] pub struct Nutrition { id: i32, name: String, manufacturer: String, barcode: String, amount: i32, divisor: i32, kJ: f32, kcal: f32, saturated_fat: f32, carbohydrate: f32, sugar: f32, fibres: f32, protein: f32, salt: f32, vitamin_b2: f32, vitamin_b12: f32, calcium: f32, phosphor: f32, } type RowType = HList!( i32, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, Option, ); impl Nutrition { fn get_sql_fields() -> String { Nutrition::FIELD_NAMES_AS_ARRAY .iter() .cloned() .intersperse(", ") .collect() } pub fn query_map_helper() -> (String, impl Fn(RowType) -> Nutrition) { let sql_query = format!("SELECT {} from nutrition", Self::get_sql_fields()); let construction_closure = |row: RowType| { let hlist_pat![ id, name, manufacturer, barcode, amount, divisor, k_j, kcal, saturated_fat, carbohydrate, sugar, fibres, protein, salt, vitamin_b2, vitamin_b12, calcium, phosphor ] = row; Nutrition { id, name: name.unwrap_or("".to_string()), manufacturer: manufacturer.unwrap_or("".to_string()), barcode: barcode.unwrap_or("".to_string()), amount: amount.unwrap_or(0), divisor: divisor.unwrap_or(0), kJ: k_j.unwrap_or(0.), kcal: kcal.unwrap_or(0.), saturated_fat: saturated_fat.unwrap_or(0.), carbohydrate: carbohydrate.unwrap_or(0.), sugar: sugar.unwrap_or(0.), fibres: fibres.unwrap_or(0.), protein: protein.unwrap_or(0.), salt: salt.unwrap_or(0.), vitamin_b2: vitamin_b2.unwrap_or(0.), vitamin_b12: vitamin_b12.unwrap_or(0.), calcium: calcium.unwrap_or(0.), phosphor: phosphor.unwrap_or(0.), } }; (sql_query, construction_closure) } }