use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Workspace {
pub workspace_id: String,
pub resource_id: String,
pub name: String,
pub location: String,
pub subscription_id: String,
pub resource_group: String,
pub tenant_id: String,
pub subscription_name: String,
}
impl Workspace {
pub fn normalize_name(name: &str) -> String {
name.chars()
.map(|c| {
if c.is_alphanumeric() || c == '-' {
c.to_ascii_lowercase()
} else {
'_'
}
})
.collect()
}
pub fn extract_resource_group(resource_id: &str) -> Option<String> {
let parts: Vec<&str> = resource_id.split('/').collect();
for (i, part) in parts.iter().enumerate() {
if part.eq_ignore_ascii_case("resourceGroups") && i + 1 < parts.len() {
return Some(parts[i + 1].to_string());
}
}
None
}
}
#[derive(Debug, Deserialize)]
pub(crate) struct WorkspaceListResponse {
pub value: Vec<WorkspaceResource>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct WorkspaceResource {
pub id: String,
pub name: String,
pub location: String,
pub properties: WorkspaceProperties,
}
#[derive(Debug, Deserialize)]
pub(crate) struct WorkspaceProperties {
#[serde(rename = "customerId")]
pub customer_id: String,
}
impl From<(WorkspaceResource, String, String, String)> for Workspace {
fn from(
(resource, subscription_id, tenant_id, subscription_name): (
WorkspaceResource,
String,
String,
String,
),
) -> Self {
let resource_group = Workspace::extract_resource_group(&resource.id)
.unwrap_or_else(|| "unknown".to_string());
Workspace {
workspace_id: resource.properties.customer_id,
resource_id: resource.id,
name: resource.name,
location: resource.location,
subscription_id,
resource_group,
tenant_id,
subscription_name,
}
}
}