saddle-framework 0.3.35

The single business-facing facade for Saddle applications
//! Ordinary named calls borrow the original request and charge their private
//! future before constructing it. No alternate legacy allocation path exists.
use super::*;

macro_rules! named_storage {
    ($name:ident, $inner:ident, $operation:ident,
     $argument:ident: $input:ty, $output:ty, $validate:expr) => {
        pub fn $name<O: $operation>(
            &mut self,
            $argument: $input,
        ) -> impl Future<Output = Result<$output, QueryFailure<$input>>> + Send {
            saddle_admission::lazy_framework_future(move || {
                // Target rejection returns the same owned argument before any
                // future storage reservation or serial-scope transition.
                if let Err(error) = O::validate_parameters($validate, &self.target()) {
                    return Err(Err(QueryFailure::Target {
                        parameters: $argument,
                        error,
                    }));
                }
                if self.state.reserved_failure.lock().unwrap().is_some() {
                    return Err(Err(QueryFailure::Database(ScopeDatabaseError::State)));
                }
                let memory = self.framework_future_memory();
                let reporter = self.shared();
                saddle_admission::managed_framework_future(
                    &memory,
                    move || {
                        #[cfg(test)]
                        controls::inner_constructed();
                        self.$inner::<O>($argument)
                    },
                    |error| reporter.record_database_future_error_at_source(error),
                )
                .map_err(|_| Err(QueryFailure::Database(ScopeDatabaseError::Resource)))
            })
        }
    };
}

impl DatabaseRequest {
    named_storage!(named_write, named_write_inner, GeneratedOwnedWrite,
        parameters: O::NamedParameters, ManagedWriteResult, &parameters);
    named_storage!(named_rows, named_rows_inner, GeneratedOwnedQuery,
        parameters: O::NamedParameters,
        crate::database::Rows<O::Row, O::NamedRow>, &parameters);
    named_storage!(named_optional, named_optional_inner, GeneratedOwnedQuery,
        parameters: O::NamedParameters, Option<O::NamedRow>, &parameters);
    named_storage!(named_probe, named_probe_inner, GeneratedOwnedQuery,
        parameters: O::NamedParameters,
        crate::database::MatchCardinality<O::NamedRow>, &parameters);
    named_storage!(named_page, named_page_inner, GeneratedPageQuery,
        request: crate::database_rows::PageRequest<O>,
        crate::database_rows::Page<O>, &request.parameters);
}

#[cfg(test)]
mod controls;