rs_split_table/rdb/
saver.rs1use tonic::Status;
4
5use crate::rdb::create::CreateTable;
6use crate::rdb::insert::Insert;
7use crate::rdb::row2tab::RowToTableName;
8use crate::rdb::tabchk::TableChecker;
9
10use crate::target::DataTarget;
11
12pub struct RdbSaver<C, I, T, R> {
13 create: C,
14 insert: I,
15 tabchk: T,
16 row2nm: R,
17}
18
19#[tonic::async_trait]
20impl<C, I, T, R> DataTarget for RdbSaver<C, I, T, R>
21where
22 C: CreateTable,
23 I: Insert,
24 T: TableChecker,
25 R: RowToTableName<Row = I::Row>,
26{
27 type Row = I::Row;
28
29 async fn save(&self, row: &Self::Row) -> Result<(), Status> {
30 let unchecked_tabname: String = self.row2nm.row2table(row)?;
31 let safe_tabname: String = self.tabchk.to_checked(unchecked_tabname)?;
32 self.create.create(safe_tabname.as_str()).await?;
33 self.insert
34 .insert_to_table(safe_tabname.as_str(), row)
35 .await?;
36 Ok(())
37 }
38}
39
40pub fn saver_new<C, I, T, R>(
48 create: C,
49 insert: I,
50 tabchk: T,
51 row2nm: R,
52) -> impl DataTarget<Row = I::Row>
53where
54 C: CreateTable,
55 I: Insert,
56 T: TableChecker,
57 R: RowToTableName<Row = I::Row>,
58{
59 RdbSaver {
60 create,
61 insert,
62 tabchk,
63 row2nm,
64 }
65}