reifydb_routine/procedure/set/
config.rs1use 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
14pub 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}