use crate::client::NexusClient;
use crate::error::{NexusError, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize)]
pub struct CreateLabelRequest {
pub name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateLabelResponse {
#[serde(default)]
pub label_id: u32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct LabelInfo {
pub name: String,
pub id: u32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListLabelsResponse {
pub labels: Vec<LabelInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateRelTypeRequest {
pub name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateRelTypeResponse {
#[serde(default)]
pub type_id: u32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct RelTypeInfo {
pub name: String,
pub id: u32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ListRelTypesResponse {
pub types: Vec<RelTypeInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
impl NexusClient {
pub async fn create_label(&self, name: String) -> Result<CreateLabelResponse> {
let request = CreateLabelRequest { name };
let url = self.get_base_url().join("/schema/labels")?;
let mut request_builder = self.get_client().post(url).json(&request);
request_builder = self.add_auth_headers(request_builder)?;
let response = self.execute_with_retry(request_builder).await?;
let status = response.status();
if status.is_success() {
let result: CreateLabelResponse = response.json().await?;
Ok(result)
} else {
let error_text = response
.text()
.await
.unwrap_or_else(|_| "Unknown error".to_string());
Err(NexusError::Api {
message: error_text,
status: status.as_u16(),
})
}
}
pub async fn list_labels(&self) -> Result<ListLabelsResponse> {
let url = self.get_base_url().join("/schema/labels")?;
let mut request_builder = self.get_client().get(url);
request_builder = self.add_auth_headers(request_builder)?;
let response = self.execute_with_retry(request_builder).await?;
let status = response.status();
if status.is_success() {
let result: ListLabelsResponse = response.json().await?;
Ok(result)
} else {
let error_text = response
.text()
.await
.unwrap_or_else(|_| "Unknown error".to_string());
Err(NexusError::Api {
message: error_text,
status: status.as_u16(),
})
}
}
pub async fn create_rel_type(&self, name: String) -> Result<CreateRelTypeResponse> {
let request = CreateRelTypeRequest { name };
let url = self.get_base_url().join("/schema/rel_types")?;
let mut request_builder = self.get_client().post(url).json(&request);
request_builder = self.add_auth_headers(request_builder)?;
let response = self.execute_with_retry(request_builder).await?;
let status = response.status();
if status.is_success() {
let result: CreateRelTypeResponse = response.json().await?;
Ok(result)
} else {
let error_text = response
.text()
.await
.unwrap_or_else(|_| "Unknown error".to_string());
Err(NexusError::Api {
message: error_text,
status: status.as_u16(),
})
}
}
pub async fn list_rel_types(&self) -> Result<ListRelTypesResponse> {
let url = self.get_base_url().join("/schema/rel_types")?;
let mut request_builder = self.get_client().get(url);
request_builder = self.add_auth_headers(request_builder)?;
let response = self.execute_with_retry(request_builder).await?;
let status = response.status();
if status.is_success() {
let result: ListRelTypesResponse = response.json().await?;
Ok(result)
} else {
let error_text = response
.text()
.await
.unwrap_or_else(|_| "Unknown error".to_string());
Err(NexusError::Api {
message: error_text,
status: status.as_u16(),
})
}
}
}