use reifydb_core::{
interface::catalog::policy::{PolicyOpToCreate, PolicyTargetType, PolicyToCreate},
value::column::columns::Columns,
};
use reifydb_rql::nodes::CreatePolicyNode;
use reifydb_transaction::transaction::admin::AdminTransaction;
use reifydb_type::value::Value;
use crate::{Result, vm::services::Services};
pub(crate) fn create_policy(
services: &Services,
txn: &mut AdminTransaction,
plan: CreatePolicyNode,
) -> Result<Columns> {
let target_type = match plan.target_type.as_str() {
"table" => PolicyTargetType::Table,
"column" => PolicyTargetType::Column,
"namespace" => PolicyTargetType::Namespace,
"procedure" => PolicyTargetType::Procedure,
"function" => PolicyTargetType::Function,
"subscription" => PolicyTargetType::Subscription,
"series" => PolicyTargetType::Series,
"dictionary" => PolicyTargetType::Dictionary,
"session" => PolicyTargetType::Session,
"feature" => PolicyTargetType::Feature,
"view" => PolicyTargetType::View,
"ringbuffer" => PolicyTargetType::RingBuffer,
_ => PolicyTargetType::Table,
};
let operations = plan
.operations
.iter()
.map(|op| PolicyOpToCreate {
operation: op.operation.clone(),
body_source: op.body_source.clone(),
})
.collect();
let to_create = PolicyToCreate {
name: plan.name.as_ref().map(|f| f.text().to_string()),
target_type,
target_namespace: plan.scope_namespace.as_ref().map(|f| f.text().to_string()),
target_shape: plan.scope_shape.as_ref().map(|f| f.text().to_string()),
operations,
};
let (def, _ops) = services.catalog.create_policy(txn, to_create)?;
let display_name = def.name.unwrap_or_else(|| format!("policy_{}", def.id));
Ok(Columns::single_row([("policy", Value::Utf8(display_name)), ("created", Value::Boolean(true))]))
}