Skip to main content

reinhardt_query/dcl/
object.rs

1//! Database object types for DCL statements
2
3/// Database object types for DCL statements
4///
5/// This enum represents the various types of database objects that can
6/// be targets of GRANT and REVOKE statements.
7///
8/// # Examples
9///
10/// ```
11/// use reinhardt_query::dcl::ObjectType;
12///
13/// let object_type = ObjectType::Table;
14/// assert_eq!(object_type.as_sql(), "TABLE");
15/// ```
16#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
17#[non_exhaustive]
18pub enum ObjectType {
19	/// Database tables
20	Table,
21	/// Entire databases
22	Database,
23	/// Database schemas (PostgreSQL-specific)
24	Schema,
25	/// Sequence objects (PostgreSQL-specific)
26	Sequence,
27	/// Functions (PostgreSQL-specific)
28	Function,
29	/// Procedures (PostgreSQL-specific)
30	Procedure,
31	/// Routines - functions or procedures (PostgreSQL-specific)
32	Routine,
33	/// User-defined types (PostgreSQL-specific)
34	Type,
35	/// Domain types (PostgreSQL-specific)
36	Domain,
37	/// Foreign data wrappers (PostgreSQL-specific)
38	ForeignDataWrapper,
39	/// Foreign servers (PostgreSQL-specific)
40	ForeignServer,
41	/// Procedural languages (PostgreSQL-specific)
42	Language,
43	/// Large objects (PostgreSQL-specific)
44	LargeObject,
45	/// Tablespaces (PostgreSQL-specific)
46	Tablespace,
47	/// Configuration parameters (PostgreSQL-specific)
48	Parameter,
49}
50
51impl ObjectType {
52	/// Returns the SQL keyword for this object type
53	///
54	/// # Examples
55	///
56	/// ```
57	/// use reinhardt_query::dcl::ObjectType;
58	///
59	/// assert_eq!(ObjectType::Table.as_sql(), "TABLE");
60	/// assert_eq!(ObjectType::Database.as_sql(), "DATABASE");
61	/// ```
62	pub fn as_sql(&self) -> &'static str {
63		match self {
64			ObjectType::Table => "TABLE",
65			ObjectType::Database => "DATABASE",
66			ObjectType::Schema => "SCHEMA",
67			ObjectType::Sequence => "SEQUENCE",
68			ObjectType::Function => "FUNCTION",
69			ObjectType::Procedure => "PROCEDURE",
70			ObjectType::Routine => "ROUTINE",
71			ObjectType::Type => "TYPE",
72			ObjectType::Domain => "DOMAIN",
73			ObjectType::ForeignDataWrapper => "FOREIGN DATA WRAPPER",
74			ObjectType::ForeignServer => "FOREIGN SERVER",
75			ObjectType::Language => "LANGUAGE",
76			ObjectType::LargeObject => "LARGE OBJECT",
77			ObjectType::Tablespace => "TABLESPACE",
78			ObjectType::Parameter => "PARAMETER",
79		}
80	}
81
82	/// Checks if this object type is PostgreSQL-specific
83	///
84	/// Returns `true` for object types that are only available in PostgreSQL,
85	/// `false` for object types that are common to both PostgreSQL and MySQL.
86	///
87	/// # Examples
88	///
89	/// ```
90	/// use reinhardt_query::dcl::ObjectType;
91	///
92	/// assert!(!ObjectType::Table.is_postgres_only());   // Common
93	/// assert!(ObjectType::Schema.is_postgres_only());    // PostgreSQL-specific
94	/// ```
95	pub fn is_postgres_only(&self) -> bool {
96		matches!(
97			self,
98			ObjectType::Schema
99				| ObjectType::Sequence
100				| ObjectType::Function
101				| ObjectType::Procedure
102				| ObjectType::Routine
103				| ObjectType::Type
104				| ObjectType::Domain
105				| ObjectType::ForeignDataWrapper
106				| ObjectType::ForeignServer
107				| ObjectType::Language
108				| ObjectType::LargeObject
109				| ObjectType::Tablespace
110				| ObjectType::Parameter
111		)
112	}
113}