rustauth_core/db/sql/
common.rs1use 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}