openauth-core 0.0.4

Core types and primitives for OpenAuth.
Documentation
use super::*;

pub fn select_fields<'a>(
    table: &'a DbTable,
    select: &[String],
) -> Result<Vec<(&'a str, &'a DbField)>, OpenAuthError> {
    if select.is_empty() {
        return Ok(table
            .fields
            .iter()
            .map(|(logical_name, field)| (logical_name.as_str(), field))
            .collect());
    }

    select
        .iter()
        .map(|field| resolve_field(table, field))
        .collect::<Result<Vec<_>, _>>()
}

pub(crate) fn selected_fields(
    table: &DbTable,
    select: &[String],
) -> Result<Vec<SqlSelectedField>, OpenAuthError> {
    select_fields(table, select)?
        .into_iter()
        .map(|(logical_name, field)| {
            Ok(SqlSelectedField {
                logical_name: logical_name.to_owned(),
                field: field.clone(),
                alias: field.name.clone(),
            })
        })
        .collect()
}

pub fn select_record(record: DbRecord, select: &[String]) -> DbRecord {
    if select.is_empty() {
        return record;
    }
    select
        .iter()
        .filter_map(|field| {
            record
                .get(field)
                .cloned()
                .map(|value| (field.clone(), value))
        })
        .collect()
}

pub fn resolve_table<'a>(schema: &'a DbSchema, model: &str) -> Result<&'a DbTable, OpenAuthError> {
    resolve_table_with_logical(schema, model).map(|(_, table)| table)
}

pub fn resolve_table_with_logical<'a>(
    schema: &'a DbSchema,
    model: &str,
) -> Result<(&'a str, &'a DbTable), OpenAuthError> {
    schema
        .tables()
        .find(|(logical_name, table)| *logical_name == model || table.name == model)
        .ok_or_else(|| OpenAuthError::TableNotFound {
            table: model.to_owned(),
        })
}

pub fn resolve_field<'a>(
    table: &'a DbTable,
    field: &str,
) -> Result<(&'a str, &'a DbField), OpenAuthError> {
    table
        .fields
        .iter()
        .find_map(|(logical_name, metadata)| {
            (logical_name == field || metadata.name == field)
                .then_some((logical_name.as_str(), metadata))
        })
        .ok_or_else(|| OpenAuthError::FieldNotFound {
            table: table.name.clone(),
            field: field.to_owned(),
        })
}

pub fn resolve_field_from_selection<'a>(
    selection: &'a [(&str, &'a DbField)],
    field: &str,
) -> Result<&'a DbField, OpenAuthError> {
    selection
        .iter()
        .find_map(|(logical_name, metadata)| {
            (*logical_name == field || metadata.name == field).then_some(*metadata)
        })
        .ok_or_else(|| OpenAuthError::FieldNotFound {
            table: "joined base selection".to_owned(),
            field: field.to_owned(),
        })
}