sqlite-requests 0.0.2

Represent SQLite queries and executes as request objects
use sqlite_requests::query::Query;
use sqlite_requests::execute::Execute;
use sqlite_requests::query::BulkQuery;
use sqlite_requests::execute::BulkExecute;
use integration_test::indexed_test_cases;
use integration_test::named_test_cases;
use integration_test::queued_params_as_arg;
use sqlite_requests::request::SqliteRequest;
use sqlite_requests::request::SqliteResponse;
use sqlite_requests::connection::AccessConnection;
use sqlite_requests::connection::ReadOnly;
use sqlite_requests::connection::ReadWrite;
use utils::temp_db::with_single_test_db;

mod serde;
mod proto;

struct SerializationRequests {
    queries: Vec<Query>,
    executes: Vec<Execute>,
    bulk_query: BulkQuery,
    bulk_execute: BulkExecute,
}

fn serialization_requests() -> SerializationRequests {
    let query_indexed_test_cases = indexed_test_cases(
        include_str!("../../res/sql/test_query_no_param.sql"),
        include_str!("../../res/sql/test_query_indexed_param.sql"),
        include_str!("../../res/sql/test_query_indexed_params.sql"),
    );
    let query_named_test_cases = named_test_cases(
        include_str!("../../res/sql/test_query_no_param.sql"),
        include_str!("../../res/sql/test_query_named_param.sql"),
        include_str!("../../res/sql/test_query_named_params.sql"),
    );
    let execute_indexed_test_cases = indexed_test_cases(
        include_str!("../../res/sql/test_execute_no_param.sql"),
        include_str!("../../res/sql/test_execute_indexed_param.sql"),
        include_str!("../../res/sql/test_execute_indexed_params.sql"),
    );
    let execute_named_test_cases = named_test_cases(
        include_str!("../../res/sql/test_execute_no_param.sql"),
        include_str!("../../res/sql/test_execute_named_param.sql"),
        include_str!("../../res/sql/test_execute_named_params.sql"),
    );

    let queries: Vec<Query> = query_indexed_test_cases.iter()
        .map(|(sql, queued_params)| {
            let queued_params = queued_params_as_arg(queued_params);
            Query::new_indexed(sql, &queued_params).unwrap()
        })
        .chain(
            query_named_test_cases.iter().map(|(sql, queued_params)| {
                let queued_params = queued_params_as_arg(queued_params);
                Query::new_named(sql, &queued_params).unwrap()
            })
        ).collect();

    let executes: Vec<Execute> = execute_indexed_test_cases.iter()
        .map(|(sql, queued_params)| {
            let queued_params = queued_params_as_arg(queued_params);
            Execute::new_indexed(sql, &queued_params).unwrap()
        })
        .chain(
            execute_named_test_cases.iter().map(|(sql, queued_params)| {
                let queued_params = queued_params_as_arg(queued_params);
                Execute::new_named(sql, &queued_params).unwrap()
            })
        )
        .collect();

    let bulk_query = BulkQuery::new(queries.clone());
    let bulk_execute = BulkExecute::new(executes.clone());

    SerializationRequests {
        queries,
        executes,
        bulk_query,
        bulk_execute,
    }
}

fn sqlite_requests() -> Vec<SqliteRequest> {
    let SerializationRequests {
        queries,
        executes,
        bulk_query,
        bulk_execute,
    } = serialization_requests();

    let mut commands: Vec<SqliteRequest> = vec![bulk_execute.into(), bulk_query.into(), ];

    commands.extend(queries.into_iter().map(Into::into));
    commands.extend(executes.into_iter().map(Into::into));

    commands
}

fn sqlite_responses() -> Vec<SqliteResponse> {
    let commands = sqlite_requests();

    commands.iter().map(|command| {
        with_single_test_db(|mut conn_ro: AccessConnection<ReadOnly>, mut conn_rw: AccessConnection<ReadWrite>| {
            match command {
                SqliteRequest::Query(sqlite_query) => {
                    SqliteResponse::Query(conn_ro.run(sqlite_query).unwrap())
                }
                SqliteRequest::Execute(sqlite_execute) => {
                    SqliteResponse::Execute(conn_rw.run(sqlite_execute).unwrap())
                }
            }
        })
    }).collect()
}