Skip to main content

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}