rsiot/components/cmp_surrealdb/tasks/
shared.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use tracing::{trace, warn};

use crate::{
    components::cmp_surrealdb::config::{FnOnFailure, FnOnSuccess},
    executor::CmpInOut,
    message::{MsgDataBound, ServiceBound},
};

use super::super::DbClient;

pub async fn execute_db_query<TMsg, TService>(
    in_out: CmpInOut<TMsg, TService>,
    query: &str,
    db_client: DbClient,
    fn_on_success: FnOnSuccess<TMsg>,
    fn_on_failure: FnOnFailure<TMsg>,
) -> super::Result<()>
where
    TMsg: MsgDataBound,
    TService: ServiceBound,
{
    trace!("Execute db query: {}", query);

    let db_client = db_client.lock().await;
    let mut response = db_client.query(query).await?;

    let errors = response.take_errors();
    let msgs = match errors.is_empty() {
        true => {
            let on_success = fn_on_success(response);
            match on_success {
                Ok(msgs) => msgs,
                Err(err) => {
                    let err = format!("Error in fn_on_success: {}", err);
                    warn!("{}", err);
                    return Ok(());
                }
            }
        }
        false => {
            warn!("Response errors: {:?}", errors);
            fn_on_failure()
        }
    };
    for msg in msgs {
        in_out.send_output(msg).await.unwrap();
    }
    Ok(())
}