Skip to main content

reifydb_routine/function/testing/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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}