reifydb_routine/function/testing/
mod.rs1use reifydb_core::value::column::{columns::Columns, data::ColumnData};
5use reifydb_type::value::{Value, r#type::Type};
6
7use crate::function::registry::FunctionsBuilder;
8
9mod changed;
10mod event;
11mod handler;
12
13use changed::TestingChanged;
14use event::TestingEventsDispatched;
15use handler::TestingHandlersInvoked;
16
17pub fn register_testing_functions(builder: FunctionsBuilder) -> FunctionsBuilder {
18 builder.register_generator("testing::events::dispatched", TestingEventsDispatched::new)
19 .register_generator("testing::handlers::invoked", TestingHandlersInvoked::new)
20 .register_generator("testing::tables::changed", || TestingChanged::new("tables"))
21 .register_generator("testing::views::changed", || TestingChanged::new("views"))
22 .register_generator("testing::series::changed", || TestingChanged::new("series"))
23 .register_generator("testing::ringbuffers::changed", || TestingChanged::new("ringbuffers"))
24 .register_generator("testing::dictionaries::changed", || TestingChanged::new("dictionaries"))
25}
26
27pub(crate) fn extract_optional_string_arg(params: &Columns) -> Option<String> {
28 if params.is_empty() {
29 return None;
30 }
31 let col = params.iter().next()?;
32 if col.data().len() == 0 {
33 return None;
34 }
35 match col.data().get_value(0) {
36 Value::Utf8(s) => Some(s),
37 _ => None,
38 }
39}
40
41pub(crate) fn column_for_values(values: &[Value]) -> ColumnData {
42 let first_type = values.iter().find_map(|v| {
43 if matches!(v, Value::None { .. }) {
44 None
45 } else {
46 Some(v.get_type())
47 }
48 });
49 match first_type {
50 Some(ty) => ColumnData::with_capacity(ty, values.len()),
51 None => ColumnData::none_typed(Type::Boolean, 0),
52 }
53}