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: enum variants define all COMMENT ON target types; not all consumed yet by backend SQL generation
28#[allow(dead_code)]
29pub enum CommentTarget {
30	/// COMMENT ON TABLE table_name
31	Table(DynIden),
32	/// COMMENT ON COLUMN table_name.column_name
33	Column(DynIden, DynIden),
34	/// COMMENT ON INDEX index_name
35	Index(DynIden),
36	/// COMMENT ON VIEW view_name
37	View(DynIden),
38	/// COMMENT ON MATERIALIZED VIEW view_name
39	MaterializedView(DynIden),
40	/// COMMENT ON SEQUENCE sequence_name
41	Sequence(DynIden),
42	/// COMMENT ON SCHEMA schema_name
43	Schema(DynIden),
44	/// COMMENT ON DATABASE database_name
45	Database(DynIden),
46	/// COMMENT ON FUNCTION function_name
47	Function(DynIden),
48	/// COMMENT ON TRIGGER trigger_name ON table_name
49	Trigger(DynIden, DynIden),
50	/// COMMENT ON TYPE type_name
51	Type(DynIden),
52}
53
54#[cfg(test)]
55mod tests {
56	use super::*;
57	use crate::types::IntoIden;
58	use rstest::*;
59
60	#[rstest]
61	fn test_comment_target_table() {
62		let target = CommentTarget::Table("users".into_iden());
63		match target {
64			CommentTarget::Table(table) => {
65				assert_eq!(table.to_string(), "users");
66			}
67			_ => panic!("Expected CommentTarget::Table"),
68		}
69	}
70
71	#[rstest]
72	fn test_comment_target_column() {
73		let target = CommentTarget::Column("users".into_iden(), "email".into_iden());
74		match target {
75			CommentTarget::Column(table, column) => {
76				assert_eq!(table.to_string(), "users");
77				assert_eq!(column.to_string(), "email");
78			}
79			_ => panic!("Expected CommentTarget::Column"),
80		}
81	}
82
83	#[rstest]
84	fn test_comment_target_index() {
85		let target = CommentTarget::Index("idx_users_email".into_iden());
86		match target {
87			CommentTarget::Index(index) => {
88				assert_eq!(index.to_string(), "idx_users_email");
89			}
90			_ => panic!("Expected CommentTarget::Index"),
91		}
92	}
93
94	#[rstest]
95	fn test_comment_target_view() {
96		let target = CommentTarget::View("active_users".into_iden());
97		match target {
98			CommentTarget::View(view) => {
99				assert_eq!(view.to_string(), "active_users");
100			}
101			_ => panic!("Expected CommentTarget::View"),
102		}
103	}
104
105	#[rstest]
106	fn test_comment_target_materialized_view() {
107		let target = CommentTarget::MaterializedView("user_stats".into_iden());
108		match target {
109			CommentTarget::MaterializedView(view) => {
110				assert_eq!(view.to_string(), "user_stats");
111			}
112			_ => panic!("Expected CommentTarget::MaterializedView"),
113		}
114	}
115
116	#[rstest]
117	fn test_comment_target_sequence() {
118		let target = CommentTarget::Sequence("user_id_seq".into_iden());
119		match target {
120			CommentTarget::Sequence(seq) => {
121				assert_eq!(seq.to_string(), "user_id_seq");
122			}
123			_ => panic!("Expected CommentTarget::Sequence"),
124		}
125	}
126
127	#[rstest]
128	fn test_comment_target_schema() {
129		let target = CommentTarget::Schema("public".into_iden());
130		match target {
131			CommentTarget::Schema(schema) => {
132				assert_eq!(schema.to_string(), "public");
133			}
134			_ => panic!("Expected CommentTarget::Schema"),
135		}
136	}
137
138	#[rstest]
139	fn test_comment_target_database() {
140		let target = CommentTarget::Database("mydb".into_iden());
141		match target {
142			CommentTarget::Database(db) => {
143				assert_eq!(db.to_string(), "mydb");
144			}
145			_ => panic!("Expected CommentTarget::Database"),
146		}
147	}
148
149	#[rstest]
150	fn test_comment_target_function() {
151		let target = CommentTarget::Function("calculate_total".into_iden());
152		match target {
153			CommentTarget::Function(func) => {
154				assert_eq!(func.to_string(), "calculate_total");
155			}
156			_ => panic!("Expected CommentTarget::Function"),
157		}
158	}
159
160	#[rstest]
161	fn test_comment_target_trigger() {
162		let target = CommentTarget::Trigger("update_timestamp".into_iden(), "users".into_iden());
163		match target {
164			CommentTarget::Trigger(trigger, table) => {
165				assert_eq!(trigger.to_string(), "update_timestamp");
166				assert_eq!(table.to_string(), "users");
167			}
168			_ => panic!("Expected CommentTarget::Trigger"),
169		}
170	}
171
172	#[rstest]
173	fn test_comment_target_type() {
174		let target = CommentTarget::Type("user_status".into_iden());
175		match target {
176			CommentTarget::Type(typ) => {
177				assert_eq!(typ.to_string(), "user_status");
178			}
179			_ => panic!("Expected CommentTarget::Type"),
180		}
181	}
182}