use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Parameter {
pub key: String,
#[serde(rename = "type")]
pub param_type: Option<String>,
pub value: Option<String>,
#[serde(default)]
pub values: Vec<String>,
pub description: Option<String>,
#[serde(default, rename = "enumOptions")]
pub enum_options: Vec<String>,
#[serde(rename = "isFreeformAllowed")]
pub is_freeform_allowed: Option<bool>,
#[serde(rename = "isMultiselect")]
pub is_multiselect: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Query {
pub query_id: i64,
pub name: String,
pub description: Option<String>,
pub query_sql: Option<String>,
#[serde(default)]
pub parameters: Vec<Parameter>,
pub owner: Option<String>,
pub is_private: Option<bool>,
pub is_archived: Option<bool>,
pub is_unsaved: Option<bool>,
pub query_engine: Option<String>,
pub version: Option<i64>,
#[serde(default)]
pub tags: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CreateQueryResponse {
pub query_id: i64,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct UpdateQueryResponse {
pub query_id: i64,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateQueryRequest {
pub name: String,
pub query_sql: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<Parameter>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_private: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
}
impl CreateQueryRequest {
pub fn new(name: &str, query_sql: &str) -> Self {
Self {
name: name.to_string(),
query_sql: query_sql.to_string(),
description: None,
parameters: None,
is_private: None,
tags: None,
}
}
pub fn description(mut self, description: &str) -> Self {
self.description = Some(description.to_string());
self
}
pub fn private(mut self, is_private: bool) -> Self {
self.is_private = Some(is_private);
self
}
pub fn tags(mut self, tags: Vec<String>) -> Self {
self.tags = Some(tags);
self
}
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct UpdateQueryRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub query_sql: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<Parameter>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ListQueriesResponse {
pub queries: Vec<Query>,
pub next_offset: Option<i64>,
}
#[derive(Debug, Clone, Default)]
pub struct ListQueriesOptions {
pub limit: Option<u32>,
pub offset: Option<i64>,
}
impl ListQueriesOptions {
pub fn to_query_string(&self) -> String {
let mut params = Vec::new();
if let Some(limit) = self.limit {
params.push(format!("limit={}", limit));
}
if let Some(offset) = self.offset {
params.push(format!("offset={}", offset));
}
if params.is_empty() {
String::new()
} else {
format!("?{}", params.join("&"))
}
}
}