Skip to main content

reinhardt_query/types/
comment.rs

1//! Comment type definitions
2//!
3//! This module provides types for comment-related DDL operations:
4//!
5//! - [`CommentTarget`]: Target object for COMMENT ON statements
6
7use crate::types::DynIden;
8
9/// Target object for COMMENT ON statement
10///
11/// This enum represents the various database objects that can have comments
12/// attached to them in PostgreSQL.
13///
14/// # Examples
15///
16/// ```rust
17/// use reinhardt_query::types::comment::CommentTarget;
18/// use reinhardt_query::types::IntoIden;
19///
20/// // COMMENT ON TABLE "users"
21/// let target = CommentTarget::Table("users".into_iden());
22///
23/// // COMMENT ON COLUMN "users"."email"
24/// let target = CommentTarget::Column("users".into_iden(), "email".into_iden());
25/// ```
26#[derive(Debug, Clone)]
27#[allow(dead_code)]
28pub enum CommentTarget {
29	/// COMMENT ON TABLE table_name
30	Table(DynIden),
31	/// COMMENT ON COLUMN table_name.column_name
32	Column(DynIden, DynIden),
33	/// COMMENT ON INDEX index_name
34	Index(DynIden),
35	/// COMMENT ON VIEW view_name
36	View(DynIden),
37	/// COMMENT ON MATERIALIZED VIEW view_name
38	MaterializedView(DynIden),
39	/// COMMENT ON SEQUENCE sequence_name
40	Sequence(DynIden),
41	/// COMMENT ON SCHEMA schema_name
42	Schema(DynIden),
43	/// COMMENT ON DATABASE database_name
44	Database(DynIden),
45	/// COMMENT ON FUNCTION function_name
46	Function(DynIden),
47	/// COMMENT ON TRIGGER trigger_name ON table_name
48	Trigger(DynIden, DynIden),
49	/// COMMENT ON TYPE type_name
50	Type(DynIden),
51}
52
53#[cfg(test)]
54mod tests {
55	use super::*;
56	use crate::types::IntoIden;
57	use rstest::*;
58
59	#[rstest]
60	fn test_comment_target_table() {
61		let target = CommentTarget::Table("users".into_iden());
62		match target {
63			CommentTarget::Table(table) => {
64				assert_eq!(table.to_string(), "users");
65			}
66			_ => panic!("Expected CommentTarget::Table"),
67		}
68	}
69
70	#[rstest]
71	fn test_comment_target_column() {
72		let target = CommentTarget::Column("users".into_iden(), "email".into_iden());
73		match target {
74			CommentTarget::Column(table, column) => {
75				assert_eq!(table.to_string(), "users");
76				assert_eq!(column.to_string(), "email");
77			}
78			_ => panic!("Expected CommentTarget::Column"),
79		}
80	}
81
82	#[rstest]
83	fn test_comment_target_index() {
84		let target = CommentTarget::Index("idx_users_email".into_iden());
85		match target {
86			CommentTarget::Index(index) => {
87				assert_eq!(index.to_string(), "idx_users_email");
88			}
89			_ => panic!("Expected CommentTarget::Index"),
90		}
91	}
92
93	#[rstest]
94	fn test_comment_target_view() {
95		let target = CommentTarget::View("active_users".into_iden());
96		match target {
97			CommentTarget::View(view) => {
98				assert_eq!(view.to_string(), "active_users");
99			}
100			_ => panic!("Expected CommentTarget::View"),
101		}
102	}
103
104	#[rstest]
105	fn test_comment_target_materialized_view() {
106		let target = CommentTarget::MaterializedView("user_stats".into_iden());
107		match target {
108			CommentTarget::MaterializedView(view) => {
109				assert_eq!(view.to_string(), "user_stats");
110			}
111			_ => panic!("Expected CommentTarget::MaterializedView"),
112		}
113	}
114
115	#[rstest]
116	fn test_comment_target_sequence() {
117		let target = CommentTarget::Sequence("user_id_seq".into_iden());
118		match target {
119			CommentTarget::Sequence(seq) => {
120				assert_eq!(seq.to_string(), "user_id_seq");
121			}
122			_ => panic!("Expected CommentTarget::Sequence"),
123		}
124	}
125
126	#[rstest]
127	fn test_comment_target_schema() {
128		let target = CommentTarget::Schema("public".into_iden());
129		match target {
130			CommentTarget::Schema(schema) => {
131				assert_eq!(schema.to_string(), "public");
132			}
133			_ => panic!("Expected CommentTarget::Schema"),
134		}
135	}
136
137	#[rstest]
138	fn test_comment_target_database() {
139		let target = CommentTarget::Database("mydb".into_iden());
140		match target {
141			CommentTarget::Database(db) => {
142				assert_eq!(db.to_string(), "mydb");
143			}
144			_ => panic!("Expected CommentTarget::Database"),
145		}
146	}
147
148	#[rstest]
149	fn test_comment_target_function() {
150		let target = CommentTarget::Function("calculate_total".into_iden());
151		match target {
152			CommentTarget::Function(func) => {
153				assert_eq!(func.to_string(), "calculate_total");
154			}
155			_ => panic!("Expected CommentTarget::Function"),
156		}
157	}
158
159	#[rstest]
160	fn test_comment_target_trigger() {
161		let target = CommentTarget::Trigger("update_timestamp".into_iden(), "users".into_iden());
162		match target {
163			CommentTarget::Trigger(trigger, table) => {
164				assert_eq!(trigger.to_string(), "update_timestamp");
165				assert_eq!(table.to_string(), "users");
166			}
167			_ => panic!("Expected CommentTarget::Trigger"),
168		}
169	}
170
171	#[rstest]
172	fn test_comment_target_type() {
173		let target = CommentTarget::Type("user_status".into_iden());
174		match target {
175			CommentTarget::Type(typ) => {
176				assert_eq!(typ.to_string(), "user_status");
177			}
178			_ => panic!("Expected CommentTarget::Type"),
179		}
180	}
181}