Skip to main content

reifydb_routine/procedure/subscription/
inspect.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use std::sync::LazyLock;
5
6use reifydb_core::{
7	interface::catalog::{id::SubscriptionId, subscription::SubscriptionInspectorRef},
8	value::column::columns::Columns,
9};
10use reifydb_type::{
11	fragment::Fragment,
12	params::Params,
13	value::{Value, r#type::Type},
14};
15
16use crate::routine::{Routine, RoutineInfo, context::ProcedureContext, error::RoutineError};
17
18static INFO: LazyLock<RoutineInfo> = LazyLock::new(|| RoutineInfo::new("subscription::inspect"));
19
20pub struct InspectSubscription;
21
22impl Default for InspectSubscription {
23	fn default() -> Self {
24		Self::new()
25	}
26}
27
28impl InspectSubscription {
29	pub fn new() -> Self {
30		Self
31	}
32}
33
34impl<'a, 'tx> Routine<ProcedureContext<'a, 'tx>> for InspectSubscription {
35	fn info(&self) -> &RoutineInfo {
36		&INFO
37	}
38
39	fn return_type(&self, _input_types: &[Type]) -> Type {
40		Type::Any
41	}
42
43	fn execute(&self, ctx: &mut ProcedureContext<'a, 'tx>, _args: &Columns) -> Result<Columns, RoutineError> {
44		let subscription_id_value = match ctx.params {
45			Params::Positional(args) if args.len() == 1 => match &args[0] {
46				Value::Uint8(id) => *id,
47				Value::Utf8(s) => {
48					s.parse::<u64>().map_err(|_| RoutineError::ProcedureExecutionFailed {
49						procedure: Fragment::internal("subscription::inspect"),
50						reason: "Invalid subscription_id format".to_string(),
51					})?
52				}
53				_ => {
54					return Err(RoutineError::ProcedureExecutionFailed {
55						procedure: Fragment::internal("subscription::inspect"),
56						reason: "subscription_id must be of type u64 or utf8".to_string(),
57					});
58				}
59			},
60			_ => {
61				return Err(RoutineError::ProcedureArityMismatch {
62					procedure: Fragment::internal("subscription::inspect"),
63					expected: 1,
64					actual: match ctx.params {
65						Params::Positional(args) => args.len(),
66						_ => 0,
67					},
68				});
69			}
70		};
71
72		let subscription_id = SubscriptionId(subscription_id_value);
73
74		// Resolve SubscriptionInspector from IoC (registered by sub-subscription factory)
75		let inspector =
76			ctx.ioc.resolve::<SubscriptionInspectorRef>()
77				.expect("SubscriptionInspector not registered in IoC");
78
79		match inspector.inspect(subscription_id) {
80			Some(columns) => Ok(columns),
81			None => Ok(Columns::empty()),
82		}
83	}
84}