Skip to main content

reifydb_routine/procedure/set/
config.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_core::value::column::columns::Columns;
5use reifydb_transaction::transaction::Transaction;
6use reifydb_type::{
7	fragment::Fragment,
8	params::Params,
9	value::{Value, r#type::Type},
10};
11
12use crate::procedure::{Procedure, context::ProcedureContext, error::ProcedureError};
13
14/// Native procedure that sets a system configuration value.
15///
16/// Accepts 2 positional arguments: key (Utf8) and value (any).
17pub struct SetConfigProcedure;
18
19impl Default for SetConfigProcedure {
20	fn default() -> Self {
21		Self::new()
22	}
23}
24
25impl SetConfigProcedure {
26	pub fn new() -> Self {
27		Self
28	}
29}
30
31impl Procedure for SetConfigProcedure {
32	fn call(&self, ctx: &ProcedureContext, tx: &mut Transaction<'_>) -> Result<Columns, ProcedureError> {
33		let (key, value) = match ctx.params {
34			Params::Positional(args) if args.len() == 2 => (args[0].clone(), args[1].clone()),
35			Params::Positional(args) => {
36				return Err(ProcedureError::ArityMismatch {
37					procedure: Fragment::internal("system::config::set"),
38					expected: 2,
39					actual: args.len(),
40				});
41			}
42			_ => {
43				return Err(ProcedureError::ArityMismatch {
44					procedure: Fragment::internal("system::config::set"),
45					expected: 2,
46					actual: 0,
47				});
48			}
49		};
50
51		let key_str = match &key {
52			Value::Utf8(s) => s.as_str().to_string(),
53			_ => {
54				return Err(ProcedureError::InvalidArgumentType {
55					procedure: Fragment::internal("system::config::set"),
56					argument_index: 0,
57					expected: vec![Type::Utf8],
58					actual: key.get_type(),
59				});
60			}
61		};
62
63		let value_clone = value.clone();
64
65		match tx {
66			Transaction::Admin(admin) => ctx.catalog.set_config(admin, &key_str, value)?,
67			Transaction::Test(t) => ctx.catalog.set_config(t.inner, &key_str, value)?,
68			_ => {
69				return Err(ProcedureError::ExecutionFailed {
70					procedure: Fragment::internal("system::config::set"),
71					reason: "must run in an admin transaction".to_string(),
72				});
73			}
74		}
75
76		Ok(Columns::single_row([("key", Value::Utf8(key_str)), ("value", value_clone)]))
77	}
78}