sqlparser/ast/helpers/
key_value_options.rs1#[cfg(not(feature = "std"))]
22use alloc::{boxed::Box, string::String, vec::Vec};
23use core::fmt;
24use core::fmt::Formatter;
25
26#[cfg(feature = "serde")]
27use serde::{Deserialize, Serialize};
28
29#[cfg(feature = "visitor")]
30use sqlparser_derive::{Visit, VisitMut};
31
32use crate::ast::{display_comma_separated, display_separated, ValueWithSpan};
33
34#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
36#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
37pub struct KeyValueOptions {
39 pub options: Vec<KeyValueOption>,
41 pub delimiter: KeyValueOptionsDelimiter,
43}
44
45#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
47#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
48pub enum KeyValueOptionsDelimiter {
50 Space,
52 Comma,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
57#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
59pub struct KeyValueOption {
61 pub option_name: String,
63 pub option_value: KeyValueOptionKind,
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
73#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
74#[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
75pub enum KeyValueOptionKind {
77 Single(ValueWithSpan),
79 Multi(Vec<ValueWithSpan>),
81 KeyValueOptions(Box<KeyValueOptions>),
83}
84
85impl fmt::Display for KeyValueOptions {
86 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
87 let sep = match self.delimiter {
88 KeyValueOptionsDelimiter::Space => " ",
89 KeyValueOptionsDelimiter::Comma => ", ",
90 };
91 write!(f, "{}", display_separated(&self.options, sep))
92 }
93}
94
95impl fmt::Display for KeyValueOption {
96 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
97 match &self.option_value {
98 KeyValueOptionKind::Single(value) => {
99 write!(f, "{}={value}", self.option_name)?;
100 }
101 KeyValueOptionKind::Multi(values) => {
102 write!(
103 f,
104 "{}=({})",
105 self.option_name,
106 display_comma_separated(values)
107 )?;
108 }
109 KeyValueOptionKind::KeyValueOptions(options) => {
110 write!(f, "{}=({options})", self.option_name)?;
111 }
112 }
113 Ok(())
114 }
115}