reifydb_routine/procedure/subscription/
inspect.rs1use 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 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}