use super::{
AccountName, DataType, DropBehavior, Expr, Extension, Ident, Literal, NoExt, ObjectName,
ParameterKind, TransactionMode,
};
use crate::vocab::Meta;
use thin_vec::ThinVec;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SessionStatement<X: Extension = NoExt> {
Set {
scope: Option<SetScope>,
name: ObjectName,
assignment: SetAssignment,
value: SetValue,
meta: Meta,
},
SetTimeZone {
scope: Option<SetScope>,
value: Box<SpecialSetValue>,
meta: Meta,
},
SetRole {
scope: Option<SetScope>,
role: Box<SpecialSetValue>,
meta: Meta,
},
SetSessionAuthorization {
scope: Option<SetScope>,
user: Box<SpecialSetValue>,
meta: Meta,
},
SetConstraints {
constraints: ConstraintsTarget,
check_time: ConstraintCheckTime,
meta: Meta,
},
SetNames {
value: Box<SetNamesValue>,
meta: Meta,
},
SetSessionCharacteristics {
modes: ThinVec<TransactionMode>,
meta: Meta,
},
Reset {
scope: Option<SetScope>,
target: ConfigParameter,
meta: Meta,
},
Show {
target: ConfigParameter,
verbose: bool,
meta: Meta,
},
SetVariables {
assignments: ThinVec<SetVariableAssignment<X>>,
meta: Meta,
},
SetCharacterSet {
keyword: CharacterSetKeyword,
value: Box<SetCharacterSetValue>,
meta: Meta,
},
SetResourceGroup {
name: Ident,
thread_ids: Option<ThinVec<Literal>>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetVariableAssignment<X: Extension = NoExt> {
SystemVariable {
scope: SystemVariableScope,
name: ObjectName,
assignment: SetAssignment,
value: SetVariableValue<X>,
meta: Meta,
},
UserVariable {
name: Ident,
assignment: SetAssignment,
value: Box<Expr<X>>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SystemVariableScope {
Implicit,
Keyword(SystemVariableScopeKind),
AtAt,
AtAtScoped(SystemVariableScopeKind),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SystemVariableScopeKind {
Global,
Session,
Local,
Persist,
PersistOnly,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetVariableValue<X: Extension = NoExt> {
Default {
meta: Meta,
},
Keyword {
keyword: SetVariableKeyword,
meta: Meta,
},
Expr {
expr: Box<Expr<X>>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetVariableKeyword {
On,
All,
Binary,
Row,
System,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum CharacterSetKeyword {
CharacterSet,
Charset,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetCharacterSetValue {
Default {
meta: Meta,
},
Charset {
charset: SetParameterValue,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetScope {
Session,
Local,
Global,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetAssignment {
To,
Equals,
ColonEquals,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetValue {
Default {
meta: Meta,
},
Values {
values: ThinVec<SetParameterValue>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetParameterValue {
Literal {
literal: Literal,
meta: Meta,
},
Name {
name: Ident,
meta: Meta,
},
Parameter {
kind: ParameterKind,
meta: Meta,
},
List {
values: ThinVec<SetParameterValue>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SpecialSetValue {
Default {
meta: Meta,
},
Local {
meta: Meta,
},
None {
meta: Meta,
},
Value {
value: SetParameterValue,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ConstraintsTarget {
All {
meta: Meta,
},
Names {
names: ThinVec<ObjectName>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ConstraintCheckTime {
Deferred,
Immediate,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SetNamesValue {
Default {
meta: Meta,
},
Charset {
charset: SetParameterValue,
collation: Option<Ident>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ConfigParameter {
All {
meta: Meta,
},
Named {
name: ObjectName,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct AlterSystem {
pub action: AlterSystemAction,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum AlterSystemAction {
Set {
name: ObjectName,
assignment: SetAssignment,
value: SetValue,
meta: Meta,
},
Reset {
target: ConfigParameter,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum AccessControlStatement<X: Extension = NoExt> {
AlterRoleRename {
name: Ident,
new_name: Ident,
meta: Meta,
},
Grant {
privileges: Privileges,
object: GrantObject<X>,
grantees: ThinVec<Grantee>,
with_grant_option: bool,
granted_by: Option<RoleSpec>,
meta: Meta,
},
Revoke {
grant_option_for: bool,
privileges: Privileges,
object: GrantObject<X>,
grantees: ThinVec<Grantee>,
granted_by: Option<RoleSpec>,
behavior: Option<DropBehavior>,
meta: Meta,
},
GrantRole {
roles: ThinVec<Ident>,
grantees: ThinVec<Grantee>,
with_admin_option: bool,
granted_by: Option<RoleSpec>,
meta: Meta,
},
RevokeRole {
admin_option_for: bool,
roles: ThinVec<Ident>,
grantees: ThinVec<Grantee>,
granted_by: Option<RoleSpec>,
behavior: Option<DropBehavior>,
meta: Meta,
},
AccountGrantPrivilege {
privileges: Privileges,
object: PrivilegeLevelObject,
grantees: ThinVec<AccountName>,
with_grant_option: bool,
grant_as: Option<Box<GrantAs>>,
meta: Meta,
},
AccountGrantProxy {
proxy: AccountName,
grantees: ThinVec<AccountName>,
with_grant_option: bool,
meta: Meta,
},
AccountGrantRole {
roles: ThinVec<AccountName>,
grantees: ThinVec<AccountName>,
with_admin_option: bool,
meta: Meta,
},
AccountRevokePrivilege {
if_exists: bool,
privileges: Privileges,
object: PrivilegeLevelObject,
grantees: ThinVec<AccountName>,
ignore_unknown_user: bool,
meta: Meta,
},
AccountRevokeAll {
if_exists: bool,
privileges_keyword: bool,
grantees: ThinVec<AccountName>,
ignore_unknown_user: bool,
meta: Meta,
},
AccountRevokeProxy {
if_exists: bool,
proxy: AccountName,
grantees: ThinVec<AccountName>,
ignore_unknown_user: bool,
meta: Meta,
},
AccountRevokeRole {
if_exists: bool,
roles: ThinVec<AccountName>,
grantees: ThinVec<AccountName>,
ignore_unknown_user: bool,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct PrivilegeLevelObject {
pub object_type: PrivilegeObjectType,
pub level: PrivilegeLevel,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum PrivilegeObjectType {
Table {
explicit: bool,
},
Function,
Procedure,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum PrivilegeLevel {
Global {
meta: Meta,
},
CurrentDatabase {
meta: Meta,
},
Database {
database: Ident,
meta: Meta,
},
Object {
name: ObjectName,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct GrantAs {
pub user: AccountName,
pub with_role: Option<WithRoleSpec>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum WithRoleSpec {
Roles {
roles: ThinVec<AccountName>,
meta: Meta,
},
All {
except: ThinVec<AccountName>,
meta: Meta,
},
None {
meta: Meta,
},
Default {
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Privileges {
All {
privileges_keyword: bool,
meta: Meta,
},
List {
privileges: ThinVec<Privilege>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum Privilege {
Known {
kind: PrivilegeKind,
columns: ThinVec<Ident>,
meta: Meta,
},
Other {
name: Ident,
columns: ThinVec<Ident>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum PrivilegeKind {
Select,
Insert,
Update,
Delete,
Truncate,
References,
Trigger,
Usage,
Execute,
Create,
Connect,
Temporary,
Temp,
Maintain,
Index,
Alter,
Drop,
Reload,
Shutdown,
Process,
File,
Super,
Event,
GrantOption,
ShowDatabases,
CreateTemporaryTables,
LockTables,
ReplicationSlave,
ReplicationClient,
CreateView,
ShowView,
CreateRoutine,
AlterRoutine,
CreateUser,
CreateTablespace,
CreateRole,
DropRole,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum GrantObject<X: Extension = NoExt> {
Table {
explicit: bool,
names: ThinVec<ObjectName>,
meta: Meta,
},
Named {
kind: NamedObjectKind,
names: ThinVec<ObjectName>,
meta: Meta,
},
Routines {
kind: RoutineObjectKind,
routines: ThinVec<RoutineSignature<X>>,
meta: Meta,
},
AllInSchema {
kind: SchemaObjectKind,
schemas: ThinVec<ObjectName>,
meta: Meta,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum NamedObjectKind {
Sequence,
Database,
Schema,
Domain,
Type,
Language,
Tablespace,
ForeignDataWrapper,
ForeignServer,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum RoutineObjectKind {
Function,
Procedure,
Routine,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum SchemaObjectKind {
Tables,
Sequences,
Functions,
Procedures,
Routines,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct RoutineSignature<X: Extension = NoExt> {
pub name: ObjectName,
pub arg_types: Option<ThinVec<DataType<X>>>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct Grantee {
pub group: bool,
pub spec: RoleSpec,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum RoleSpec {
Public {
meta: Meta,
},
CurrentRole {
meta: Meta,
},
CurrentUser {
meta: Meta,
},
SessionUser {
meta: Meta,
},
Name {
name: Ident,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct CreateUser {
pub if_not_exists: bool,
pub users: ThinVec<UserSpec>,
pub default_roles: ThinVec<AccountName>,
pub require: Option<TlsRequirement>,
pub resource_options: ThinVec<ResourceLimit>,
pub password_lock_options: ThinVec<PasswordLockOption>,
pub attribute: Option<UserAttribute>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct UserSpec {
pub account: AccountName,
pub auth: Option<AuthOption>,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum AuthOption {
Password {
password: Literal,
meta: Meta,
},
RandomPassword {
meta: Meta,
},
Plugin {
plugin: Ident,
meta: Meta,
},
PluginAs {
plugin: Ident,
auth_string: Literal,
meta: Meta,
},
PluginByPassword {
plugin: Ident,
password: Literal,
meta: Meta,
},
PluginByRandomPassword {
plugin: Ident,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum AlterUser {
Modify {
if_exists: bool,
users: ThinVec<AlterUserSpec>,
require: Option<TlsRequirement>,
resource_options: ThinVec<ResourceLimit>,
password_lock_options: ThinVec<PasswordLockOption>,
attribute: Option<UserAttribute>,
meta: Meta,
},
DefaultRole {
if_exists: bool,
user: AccountName,
roles: DefaultRoleTarget,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct AlterUserSpec {
pub account: AccountName,
pub auth: Option<AuthOption>,
pub replace: Option<Literal>,
pub retain_current_password: bool,
pub discard_old_password: bool,
pub meta: Meta,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum DefaultRoleTarget {
All {
meta: Meta,
},
None {
meta: Meta,
},
Roles {
roles: ThinVec<AccountName>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub struct UserRoleList {
pub kind: UserRoleListKind,
pub if_guard: bool,
pub names: ThinVec<AccountName>,
pub meta: Meta,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum UserRoleListKind {
DropUser,
CreateRole,
DropRole,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TlsRequirement {
None {
meta: Meta,
},
Ssl {
meta: Meta,
},
X509 {
meta: Meta,
},
Options {
options: ThinVec<TlsOption>,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum TlsOption {
Subject {
value: Literal,
meta: Meta,
},
Issuer {
value: Literal,
meta: Meta,
},
Cipher {
value: Literal,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum ResourceLimit {
MaxQueriesPerHour {
value: Literal,
meta: Meta,
},
MaxUpdatesPerHour {
value: Literal,
meta: Meta,
},
MaxConnectionsPerHour {
value: Literal,
meta: Meta,
},
MaxUserConnections {
value: Literal,
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum PasswordLockOption {
AccountLock {
meta: Meta,
},
AccountUnlock {
meta: Meta,
},
PasswordExpire {
meta: Meta,
},
PasswordExpireDefault {
meta: Meta,
},
PasswordExpireNever {
meta: Meta,
},
PasswordExpireInterval {
days: Literal,
meta: Meta,
},
PasswordHistory {
count: Literal,
meta: Meta,
},
PasswordHistoryDefault {
meta: Meta,
},
PasswordReuseInterval {
days: Literal,
meta: Meta,
},
PasswordReuseIntervalDefault {
meta: Meta,
},
PasswordRequireCurrent {
meta: Meta,
},
PasswordRequireCurrentDefault {
meta: Meta,
},
PasswordRequireCurrentOptional {
meta: Meta,
},
FailedLoginAttempts {
count: Literal,
meta: Meta,
},
PasswordLockTime {
days: Literal,
meta: Meta,
},
PasswordLockTimeUnbounded {
meta: Meta,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde-serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "serde-deserialize", derive(serde::Deserialize))]
pub enum UserAttribute {
Comment {
comment: Literal,
meta: Meta,
},
Attribute {
attribute: Literal,
meta: Meta,
},
}