reifydb_core/interface/catalog/
policy.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use std::fmt::{Display, Formatter};
5
6use serde::{Deserialize, Serialize};
7
8use crate::interface::catalog::{ColumnId, ColumnPolicyId};
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct ColumnPolicy {
12	pub id: ColumnPolicyId,
13	pub column: ColumnId,
14	pub policy: ColumnPolicyKind,
15}
16
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub enum ColumnPolicyKind {
19	Saturation(ColumnSaturationPolicy),
20}
21
22impl ColumnPolicyKind {
23	pub fn to_u8(&self) -> (u8, u8) {
24		match self {
25			ColumnPolicyKind::Saturation(policy) => match policy {
26				ColumnSaturationPolicy::Error => (0x01, 0x01),
27				ColumnSaturationPolicy::Undefined => (0x01, 0x02),
28			},
29		}
30	}
31
32	pub fn from_u8(policy: u8, value: u8) -> ColumnPolicyKind {
33		match (policy, value) {
34			(0x01, 0x01) => ColumnPolicyKind::Saturation(ColumnSaturationPolicy::Error),
35			(0x01, 0x02) => ColumnPolicyKind::Saturation(ColumnSaturationPolicy::Undefined),
36			_ => unimplemented!(),
37		}
38	}
39
40	pub fn default_saturation_policy() -> Self {
41		Self::Saturation(ColumnSaturationPolicy::default())
42	}
43}
44
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46pub enum ColumnSaturationPolicy {
47	Error,
48	// Saturate,
49	// Wrap,
50	// Zero,
51	Undefined,
52}
53
54impl Display for ColumnPolicyKind {
55	fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
56		match self {
57			ColumnPolicyKind::Saturation(_) => f.write_str("saturation"),
58		}
59	}
60}
61
62pub const DEFAULT_COLUMN_SATURATION_POLICY: ColumnSaturationPolicy = ColumnSaturationPolicy::Error;
63
64impl Default for ColumnSaturationPolicy {
65	fn default() -> Self {
66		Self::Error
67	}
68}