Add some strohnger typing and documentation

Still experimenting with the API here, but stronger typing will help
This commit is contained in:
R Tyler Croy 2024-01-03 16:31:28 -08:00
parent fb406c535a
commit 4736d0b748
3 changed files with 88 additions and 4 deletions

View File

@ -11,6 +11,7 @@ chrono = "0.4.31"
feignhttp = { version = "0.5.1", features = ["json"]}
once_cell = "1"
serde = { version = "1", features = ["derive"]}
serde_json = "*"
tracing = "0.1.40"
url = { version = "2", features = ["serde"] }

View File

@ -8,7 +8,6 @@ async fn main() -> Result<(), anyhow::Error> {
println!("Starting example..");
let mut warehouse = Warehouse {
name: "rust-test".into(),
cluster_size: "Large".into(),
min_num_clusters: 1,
max_num_clusters: 2,
spot_instance_policy: "POLICY_UNSPECIFIED".into(),

View File

@ -6,11 +6,72 @@ use url::Url;
use std::collections::HashMap;
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub enum Size {
#[serde(rename = "2X-Small")]
XXSmall,
#[serde(rename = "X-Small")]
XSmall,
Small,
Medium,
#[default]
Large,
#[serde(rename = "X-Large")]
XLarge,
#[serde(rename = "2X-Large")]
XXLarge,
#[serde(rename = "3X-Large")]
XXXLarge,
#[serde(rename = "4X-Large")]
XXXXLarge,
}
#[cfg(test)]
mod size_tests {
use super::*;
#[test]
fn serialize_default() {
let s = Size::default();
let buf = serde_json::to_string(&s).expect("Failed to serialize");
assert_eq!(buf, "\"Large\"");
}
#[test]
fn serialize_xs() {
let s = Size::XSmall;
let buf = serde_json::to_string(&s).expect("Failed to serialize");
assert_eq!(buf, "\"X-Small\"");
}
}
/// Rust representation of a Warehouse structure
///
/// ```rust
/// use databricks::sql::{Warehouse, Size};
///
/// let warehouse_json = r#"{
/// "name": "test-cluster",
/// "cluster_size": "Large",
/// "min_num_clusters": 1,
/// "max_num_clusters": 0,
/// "auto_stop_mins": 10,
/// "creator_name": "serge",
/// "instance_profile_arn": "string",
/// "spot_instance_policy": "POLICY_UNSPECIFIED",
/// "enable_photon": true,
/// "enable_serverless_compute": true,
/// "warehouse_type": "TYPE_UNSPECIFIED"
/// }"#;
/// let warehouse = Warehouse::try_from(warehouse_json).expect("Failed to create warehouse instance");
/// assert_eq!(warehouse.name, "test-cluster");
/// assert_eq!(warehouse.cluster_size, Size::Large);
/// ```
#[allow(unused)]
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[serde(default)]
pub struct Warehouse {
#[serde(default, skip_deserializing, skip_serializing)]
#[serde(skip_deserializing, skip_serializing)]
pub config: crate::Config,
/// id of the [Warehouse], only available if retrieved from REST API
#[serde(skip_serializing)]
@ -18,7 +79,7 @@ pub struct Warehouse {
pub name: String,
#[serde(skip_serializing)]
pub state: String,
pub cluster_size: String,
pub cluster_size: crate::sql::Size,
pub min_num_clusters: u64,
pub max_num_clusters: u64,
#[serde(skip_serializing)]
@ -44,6 +105,13 @@ pub struct Warehouse {
pub channel: Option<Channel>,
}
impl TryFrom<&str> for Warehouse {
type Error = serde_json::Error;
fn try_from(buf: &str) -> Result<Self, Self::Error> {
serde_json::from_str(buf)
}
}
impl Warehouse {
/// Start the warehouse
pub async fn start(&self) -> feignhttp::Result<String> {
@ -193,4 +261,20 @@ mod api {
}
#[cfg(test)]
mod tests {}
mod tests {
use super::*;
#[test]
fn warehouse_default() {
let warehouse = Warehouse::default();
assert_eq!(warehouse.id, None);
}
#[test]
fn warehouse_tryfrom() {
let buf = r#"{"name":"rust-test","cluster_size":"Large","min_num_clusters":1,"max_num_clusters":2,"spot_instance_policy":"POLICY_UNSPECIFIED","enable_photon":true,"auto_stop_mins":20,"enable_serverless_compute":true,"warehouse_type":"PRO"}"#;
let warehouse = Warehouse::try_from(buf).expect("Failed to deserialize");
assert_eq!(warehouse.id, None);
assert_eq!(warehouse.name, "rust-test");
}
}