Add some strohnger typing and documentation
Still experimenting with the API here, but stronger typing will help
This commit is contained in:
parent
fb406c535a
commit
4736d0b748
|
@ -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"] }
|
||||
|
||||
|
|
|
@ -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(),
|
||||
|
|
90
src/sql.rs
90
src/sql.rs
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue