rsiot/components/cmp_surrealdb/config.rs
1use surrealdb::IndexedResults;
2
3/// Конфигурация cmp_surrealdb
4#[derive(Clone, Debug)]
5pub struct Config<TMsg> {
6 /// Конфигурация подключения к базе данных
7 pub connection: ConfigConnection,
8
9 /// root
10 pub user: String,
11
12 /// root
13 pub password: String,
14
15 /// rsiot
16 pub namespace: String,
17
18 /// rsiot
19 pub database: String,
20
21 /// Скрипт для инициализации БД. Выполняется, если при запуске не существует namespace
22 pub init_script: String,
23
24 /// Конфигурация запросов на основе входных сообщений
25 pub request_input: Vec<RequestInputConfig<TMsg>>,
26
27 /// Конфигурация запросов, выполняющихся при запуске
28 pub request_start: Vec<RequestStartConfig<TMsg>>,
29}
30
31pub type FnOnSuccess<TMsg> = fn(&mut IndexedResults) -> Result<Vec<TMsg>, anyhow::Error>;
32pub type FnOnFailure<TMsg> = fn() -> Vec<TMsg>;
33
34/// Конфигурация запросов, которые выполняются на основе входного потока сообщений
35#[derive(Clone, Debug)]
36pub struct RequestInputConfig<TMsg> {
37 /// Функция формирования запроса на основе потока сообщений
38 pub fn_input: fn(&TMsg) -> Option<String>,
39 /// Функция вызывается при успешно выполненном запросе
40 pub fn_on_success: FnOnSuccess<TMsg>,
41 /// Функция вызывается при ошибке выполнения запроса
42 pub fn_on_failure: FnOnFailure<TMsg>,
43}
44
45/// Конфигурация запросов, которые выполняются один раз при запуске
46#[derive(Clone, Debug)]
47pub struct RequestStartConfig<TMsg> {
48 /// Функция формирования запроса на основе потока сообщений
49 pub query: String,
50 /// Функция вызывается при успешно выполненном запросе
51 pub fn_on_success: FnOnSuccess<TMsg>,
52 /// Функция вызывается при ошибке выполнения запроса
53 pub fn_on_failure: FnOnFailure<TMsg>,
54}
55
56/// Конфигурация подключения к базе данных
57#[derive(Clone, Debug)]
58pub enum ConfigConnection {
59 /// Подключение к базе данных через WebSocket
60 ///
61 /// Необходимо активировать feature `protocol-http`
62 Http {
63 /// localhost
64 host: String,
65
66 /// 8000
67 port: u16,
68 },
69
70 /// Подключение к базе данных через WebSocket с TLS
71 ///
72 /// Необходимо активировать feature `protocol-http`
73 HttpSecure {
74 /// localhost
75 host: String,
76
77 /// 8000
78 port: u16,
79 },
80
81 /// Подключение к базе данных через Indxdb
82 ///
83 /// Необходимо активировать feature `kv-indxdb`
84 Indxdb {
85 /// Название файла базы данных
86 file_name: String,
87 },
88
89 /// Сохранение данных в памяти
90 ///
91 /// Необходимо активировать feature `kv-mem`
92 Memory,
93
94 /// Сохранение данных в памяти
95 ///
96 /// Необходимо активировать feature `kv-mem`
97 MemoryPersistent {
98 /// Название файла базы данных
99 file_name: String,
100 },
101
102 /// Сохранение данных в файле на диске RocksDB
103 ///
104 /// Необходимо активировать feature `kv-rocksdb`
105 RocksDB {
106 /// Название файла базы данных
107 ///
108 /// Примеры:
109 ///
110 /// ```
111 /// file_name: "database".into()
112 /// ```
113 file_name: String,
114 },
115
116 /// Сохранение данных в файле на диске SurrealKV
117 ///
118 /// Необходимо активировать feature `kv-surrealkv`
119 SurrealKv {
120 /// Название файла базы данных
121 ///
122 /// Примеры:
123 ///
124 /// ```
125 /// file_name: "database".into()
126 /// ```
127 file_name: String,
128 },
129
130 /// Подключение к базе данных TiKV
131 ///
132 /// Необходимо активировать feature `kv-tikv`
133 TiKV {
134 /// localhost
135 host: String,
136
137 /// 2379
138 port: u16,
139 },
140
141 /// Подключение к базе данных через WebSocket
142 ///
143 /// Необходимо активировать feature `protocol-ws`
144 Websocket {
145 /// localhost
146 host: String,
147
148 /// 8000
149 port: u16,
150 },
151
152 /// Подключение к базе данных через WebSocket
153 ///
154 /// Необходимо активировать feature `protocol-ws`
155 WebsocketSecure {
156 /// localhost
157 host: String,
158
159 /// 8000
160 port: u16,
161 },
162}
163
164impl ConfigConnection {
165 /// Возвращает строку с адресом подключения к базе данных
166 pub fn address(&self) -> String {
167 match self {
168 ConfigConnection::Http { host, port } => format!("http://{}:{}", host, port),
169 ConfigConnection::HttpSecure { host, port } => format!("https://{}:{}", host, port),
170 ConfigConnection::Indxdb { file_name } => format!("indxdb://{}", file_name),
171 ConfigConnection::Memory => "mem://".to_string(),
172 ConfigConnection::MemoryPersistent { file_name } => format!("mem://{}", file_name),
173 ConfigConnection::RocksDB { file_name } => format!("rocksdb://{}", file_name),
174 ConfigConnection::SurrealKv { file_name } => format!("surrealkv://{}", file_name),
175 ConfigConnection::TiKV { host, port } => format!("tikv://{}:{}", host, port),
176 ConfigConnection::Websocket { host, port } => format!("ws://{}:{}", host, port),
177 ConfigConnection::WebsocketSecure { host, port } => format!("wss://{}:{}", host, port),
178 }
179 }
180}