Skip to main content

rustauth_core/db/sql/
common.rs

1use super::*;
2
3pub fn select_fields<'a>(
4    table: &'a DbTable,
5    select: &[String],
6) -> Result<Vec<(&'a str, &'a DbField)>, RustAuthError> {
7    if select.is_empty() {
8        return Ok(table
9            .fields
10            .iter()
11            .map(|(logical_name, field)| (logical_name.as_str(), field))
12            .collect());
13    }
14
15    select
16        .iter()
17        .map(|field| resolve_field(table, field))
18        .collect::<Result<Vec<_>, _>>()
19}
20
21pub(crate) fn selected_fields(
22    table: &DbTable,
23    select: &[String],
24) -> Result<Vec<SqlSelectedField>, RustAuthError> {
25    select_fields(table, select)?
26        .into_iter()
27        .map(|(logical_name, field)| {
28            Ok(SqlSelectedField {
29                logical_name: logical_name.to_owned(),
30                field: field.clone(),
31                alias: field.name.clone(),
32            })
33        })
34        .collect()
35}
36
37pub fn select_record(record: DbRecord, select: &[String]) -> DbRecord {
38    if select.is_empty() {
39        return record;
40    }
41    select
42        .iter()
43        .filter_map(|field| {
44            record
45                .get(field)
46                .cloned()
47                .map(|value| (field.clone(), value))
48        })
49        .collect()
50}
51
52pub fn resolve_table<'a>(schema: &'a DbSchema, model: &str) -> Result<&'a DbTable, RustAuthError> {
53    resolve_table_with_logical(schema, model).map(|(_, table)| table)
54}
55
56pub fn resolve_table_with_logical<'a>(
57    schema: &'a DbSchema,
58    model: &str,
59) -> Result<(&'a str, &'a DbTable), RustAuthError> {
60    schema
61        .tables()
62        .find(|(logical_name, table)| *logical_name == model || table.name == model)
63        .ok_or_else(|| RustAuthError::TableNotFound {
64            table: model.to_owned(),
65        })
66}
67
68pub fn resolve_field<'a>(
69    table: &'a DbTable,
70    field: &str,
71) -> Result<(&'a str, &'a DbField), RustAuthError> {
72    table
73        .fields
74        .iter()
75        .find_map(|(logical_name, metadata)| {
76            (logical_name == field || metadata.name == field)
77                .then_some((logical_name.as_str(), metadata))
78        })
79        .ok_or_else(|| RustAuthError::FieldNotFound {
80            table: table.name.clone(),
81            field: field.to_owned(),
82        })
83}
84
85pub fn resolve_field_from_selection<'a>(
86    selection: &'a [(&str, &'a DbField)],
87    field: &str,
88) -> Result<&'a DbField, RustAuthError> {
89    selection
90        .iter()
91        .find_map(|(logical_name, metadata)| {
92            (*logical_name == field || metadata.name == field).then_some(*metadata)
93        })
94        .ok_or_else(|| RustAuthError::FieldNotFound {
95            table: "joined base selection".to_owned(),
96            field: field.to_owned(),
97        })
98}