calories/src/my_structs/nutrition.rs
2024-08-13 20:11:12 +02:00

106 lines
2.7 KiB
Rust

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<String>,
Option<String>,
Option<String>,
Option<i32>,
Option<i32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
Option<f32>,
);
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)
}
}