1use serde::{Deserialize, Serialize};
2use std::borrow::Cow;
3
4#[derive(Debug, Clone, Deserialize, Serialize)]
5#[serde(rename_all = "camelCase")]
6pub struct SqlQueryOutput {
7 pub name: String,
8 pub source: String,
9 pub documentation: Option<String>,
10 pub parameters: Vec<SqlQueryParameterOutput>,
11 pub result_columns: Vec<SqlQueryColumnOutput>,
12}
13
14#[derive(Debug, Clone, Deserialize, Serialize)]
15pub struct SqlQueryParameterOutput {
16 pub name: String,
17 pub typ: QueryIntrospectionType,
18 pub documentation: Option<String>,
19 pub nullable: bool,
20}
21
22#[derive(Debug, Clone, Deserialize, Serialize)]
23pub struct SqlQueryColumnOutput {
24 pub name: String,
25 pub typ: QueryIntrospectionType,
26 pub nullable: bool,
27}
28
29#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash)]
30#[serde(untagged)]
31pub enum QueryIntrospectionType {
32 Builtin(QueryIntrospectionBuiltinType),
33 UserDefined(Cow<'static, str>),
34}
35
36#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash)]
39#[serde(rename_all = "kebab-case")]
40pub enum QueryIntrospectionBuiltinType {
41 Int,
42 Bigint,
43 Float,
44 Double,
45 String,
46 Enum,
47 Bytes,
48 Bool,
49 Char,
50 Decimal,
51 Json,
52 Xml,
53 Uuid,
54 Datetime,
55 Date,
56 Time,
57 IntArray,
58 BigintArray,
59 FloatArray,
60 DoubleArray,
61 StringArray,
62 CharArray,
63 BytesArray,
64 BoolArray,
65 DecimalArray,
66 JsonArray,
67 XmlArray,
68 UuidArray,
69 DatetimeArray,
70 DateArray,
71 TimeArray,
72 Null,
73 Unknown,
74}
75
76impl From<&'static str> for QueryIntrospectionType {
77 fn from(s: &'static str) -> Self {
78 match s {
79 "int" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Int),
80 "bigint" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bigint),
81 "float" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Float),
82 "double" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Double),
83 "string" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::String),
84 "enum" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Enum),
85 "bytes" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bytes),
86 "bool" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bool),
87 "char" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Char),
88 "decimal" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Decimal),
89 "json" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Json),
90 "xml" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Xml),
91 "uuid" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Uuid),
92 "datetime" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Datetime),
93 "date" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Date),
94 "time" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Time),
95 "int-array" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::IntArray),
96 "bigint-array" => {
97 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BigintArray)
98 }
99 "float-array" => {
100 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::FloatArray)
101 }
102 "double-array" => {
103 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DoubleArray)
104 }
105 "string-array" => {
106 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::StringArray)
107 }
108 "char-array" => {
109 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::CharArray)
110 }
111 "bytes-array" => {
112 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BytesArray)
113 }
114 "bool-array" => {
115 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BoolArray)
116 }
117 "decimal-array" => {
118 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DecimalArray)
119 }
120 "json-array" => {
121 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::JsonArray)
122 }
123 "xml-array" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::XmlArray),
124 "uuid-array" => {
125 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::UuidArray)
126 }
127 "datetime-array" => {
128 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DatetimeArray)
129 }
130 "date-array" => {
131 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DateArray)
132 }
133 "time-array" => {
134 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::TimeArray)
135 }
136 "null" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Null),
137 "unknown" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Unknown),
138 other => QueryIntrospectionType::UserDefined(other.into()),
139 }
140 }
141}
142
143impl From<String> for QueryIntrospectionType {
144 fn from(s: String) -> Self {
145 match s.as_str() {
146 "int" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Int),
147 "bigint" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bigint),
148 "float" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Float),
149 "double" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Double),
150 "string" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::String),
151 "enum" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Enum),
152 "bytes" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bytes),
153 "bool" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Bool),
154 "char" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Char),
155 "decimal" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Decimal),
156 "json" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Json),
157 "xml" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Xml),
158 "uuid" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Uuid),
159 "datetime" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Datetime),
160 "date" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Date),
161 "time" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Time),
162 "int-array" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::IntArray),
163 "bigint-array" => {
164 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BigintArray)
165 }
166 "float-array" => {
167 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::FloatArray)
168 }
169 "double-array" => {
170 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DoubleArray)
171 }
172 "string-array" => {
173 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::StringArray)
174 }
175 "char-array" => {
176 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::CharArray)
177 }
178 "bytes-array" => {
179 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BytesArray)
180 }
181 "bool-array" => {
182 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::BoolArray)
183 }
184 "decimal-array" => {
185 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DecimalArray)
186 }
187 "json-array" => {
188 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::JsonArray)
189 }
190 "xml-array" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::XmlArray),
191 "uuid-array" => {
192 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::UuidArray)
193 }
194 "datetime-array" => {
195 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DatetimeArray)
196 }
197 "date-array" => {
198 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::DateArray)
199 }
200 "time-array" => {
201 QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::TimeArray)
202 }
203 "null" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Null),
204 "unknown" => QueryIntrospectionType::Builtin(QueryIntrospectionBuiltinType::Unknown),
205 other => QueryIntrospectionType::UserDefined(other.to_string().into()),
206 }
207 }
208}