prisma_rust_schema/
typed_sql.rs

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// This must remain in sync with the `quaint::ColumnType` enum in the QueryEngine.
37// https://github.com/prisma/prisma-engines/blob/main/quaint/src/connector/column_type.rs#L12
38#[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}