mz_sql/session/vars/
errors.rs1use std::borrow::Cow;
11
12use itertools::Itertools;
13
14use mz_ore::str::StrExt;
15
16use crate::session::vars::{FeatureFlag, Var};
17
18#[derive(Clone, Debug, Eq, PartialEq, thiserror::Error)]
22pub enum VarError {
23 #[error(
25 "invalid value for parameter {}: {}",
26 name.quoted(),
27 invalid_values.iter().map(|v| v.quoted()).join(",")
28 )]
29 ConstrainedParameter {
30 name: &'static str,
32 invalid_values: Vec<String>,
33 valid_values: Option<Vec<&'static str>>,
34 },
35 #[error(
40 "parameter {} can only be set to {}",
41 name.quoted(),
42 value.quoted(),
43 )]
44 FixedValueParameter {
45 name: &'static str,
47 value: String,
49 },
50 #[error(
52 "parameter {} requires a {} value",
53 name.quoted(),
54 required_type.quoted()
55 )]
56 InvalidParameterType {
57 name: &'static str,
59 required_type: Cow<'static, str>,
61 },
62 #[error(
64 "parameter {} cannot have value {}: {}",
65 name.quoted(),
66 invalid_values
67 .iter()
68 .map(|v| v.quoted().to_string())
69 .collect::<Vec<_>>()
70 .join(","),
71 reason,
72 )]
73 InvalidParameterValue {
74 name: &'static str,
76 invalid_values: Vec<String>,
78 reason: String,
80 },
81 #[error("parameter {} cannot be changed", .0.quoted())]
83 ReadOnlyParameter(&'static str),
84 #[error("unrecognized configuration parameter {}", .0.quoted())]
86 UnknownParameter(String),
87 #[error("parameter {} can only be set in unsafe mode", .0.quoted())]
89 RequiresUnsafeMode(&'static str),
90 #[error(
91 "{} is not {}",
92 .feature_flag.feature_desc,
93 if .feature_flag.flag.is_unsafe() { "supported" } else { "available" }
94 )]
95 RequiresFeatureFlag { feature_flag: &'static FeatureFlag },
96}
97
98impl VarError {
99 pub fn detail(&self) -> Option<String> {
100 match self {
101 Self::RequiresFeatureFlag { feature_flag } => {
102 if feature_flag.flag.is_unsafe() {
103 Some(format!(
104 "The requested feature ({}) is unsafe and is meant only for internal development and testing of Materialize.",
105 feature_flag.flag.name(),
106 ))
107 } else {
108 Some(format!(
109 "The requested feature ({}) is in private preview.",
110 feature_flag.flag.name(),
111 ))
112 }
113 }
114 _ => None,
115 }
116 }
117
118 pub fn hint(&self) -> Option<String> {
119 match self {
120 VarError::ConstrainedParameter {
121 valid_values: Some(valid_values),
122 ..
123 } => Some(format!("Available values: {}.", valid_values.join(", "))),
124 VarError::RequiresFeatureFlag { feature_flag } if !feature_flag.flag.is_unsafe() => {
125 Some(
126 "Contact support to discuss enabling the feature in your Materialize region."
127 .into(),
128 )
129 }
130 _ => None,
131 }
132 }
133}
134
135#[derive(Debug)]
144pub enum VarParseError {
145 ConstrainedParameter {
147 invalid_values: Vec<String>,
148 valid_values: Option<Vec<&'static str>>,
149 },
150 FixedValueParameter,
152 InvalidParameterType,
154 InvalidParameterValue {
156 invalid_values: Vec<String>,
157 reason: String,
158 },
159}
160
161impl VarParseError {
162 pub fn into_var_error(self, var: &dyn Var) -> VarError {
164 match self {
165 VarParseError::ConstrainedParameter {
166 invalid_values,
167 valid_values,
168 } => VarError::ConstrainedParameter {
169 name: var.name(),
170 invalid_values,
171 valid_values,
172 },
173 VarParseError::FixedValueParameter => VarError::FixedValueParameter {
174 name: var.name(),
175 value: var.value(),
176 },
177 VarParseError::InvalidParameterType => VarError::InvalidParameterType {
178 name: var.name(),
179 required_type: var.type_name(),
180 },
181 VarParseError::InvalidParameterValue {
182 invalid_values,
183 reason,
184 } => VarError::InvalidParameterValue {
185 name: var.name(),
186 invalid_values,
187 reason,
188 },
189 }
190 }
191}