use crate::Client;
use crate::resource::Resource;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTenantRequest {
pub name: String,
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub group: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateTenantRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub group: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTenantGroupRequest {
pub name: String,
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateTenantGroupRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateContactRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub groups: Option<Vec<i32>>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateContactRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub groups: Option<Vec<i32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateContactGroupRequest {
pub name: String,
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateContactGroupRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub comments: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateContactRoleRequest {
pub name: String,
pub slug: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateContactRoleRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<i32>>,
}
pub type Tenant = crate::models::Tenant;
pub type TenantGroup = crate::models::TenantGroup;
pub type Contact = crate::models::Contact;
pub type ContactGroup = crate::models::ContactGroup;
pub type ContactRole = crate::models::ContactRole;
pub type ContactAssignment = crate::models::ContactAssignment;
pub type ContactAssignmentsApi = Resource<crate::models::ContactAssignment>;
pub type ContactGroupsApi = Resource<crate::models::ContactGroup>;
pub type ContactRolesApi = Resource<crate::models::ContactRole>;
pub type ContactsApi = Resource<crate::models::Contact>;
pub type TenantGroupsApi = Resource<crate::models::TenantGroup>;
pub type TenantsApi = Resource<crate::models::Tenant>;
#[derive(Clone)]
pub struct TenancyApi {
client: Client,
}
impl TenancyApi {
pub(crate) fn new(client: Client) -> Self {
Self { client }
}
pub fn contact_assignments(&self) -> ContactAssignmentsApi {
Resource::new(self.client.clone(), "tenancy/contact-assignments/")
}
pub fn contact_groups(&self) -> ContactGroupsApi {
Resource::new(self.client.clone(), "tenancy/contact-groups/")
}
pub fn contact_roles(&self) -> ContactRolesApi {
Resource::new(self.client.clone(), "tenancy/contact-roles/")
}
pub fn contacts(&self) -> ContactsApi {
Resource::new(self.client.clone(), "tenancy/contacts/")
}
pub fn tenant_groups(&self) -> TenantGroupsApi {
Resource::new(self.client.clone(), "tenancy/tenant-groups/")
}
pub fn tenants(&self) -> TenantsApi {
Resource::new(self.client.clone(), "tenancy/tenants/")
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ClientConfig;
fn test_client() -> Client {
let config = ClientConfig::new("https://netbox.example.com", "token");
Client::new(config).unwrap()
}
fn assert_path<T>(resource: Resource<T>, expected: &str)
where
T: serde::de::DeserializeOwned,
{
let paginator = resource.paginate(None).unwrap();
assert_eq!(paginator.next_url(), Some(expected));
}
#[test]
fn tenancy_accessors_return_expected_paths() {
let api = TenancyApi::new(test_client());
assert_path(api.contact_assignments(), "tenancy/contact-assignments/");
assert_path(api.contact_groups(), "tenancy/contact-groups/");
assert_path(api.contact_roles(), "tenancy/contact-roles/");
assert_path(api.contacts(), "tenancy/contacts/");
assert_path(api.tenant_groups(), "tenancy/tenant-groups/");
assert_path(api.tenants(), "tenancy/tenants/");
}
#[test]
fn serialize_tenancy_requests() {
let tenant = CreateTenantRequest {
name: "acme".to_string(),
slug: "acme".to_string(),
group: Some(1),
description: None,
comments: None,
tags: None,
};
let value = serde_json::to_value(&tenant).unwrap();
assert_eq!(value["name"], "acme");
assert_eq!(value["slug"], "acme");
assert_eq!(value["group"], 1);
let contact = CreateContactRequest {
groups: Some(vec![1, 2]),
name: "Alice".to_string(),
title: None,
phone: None,
email: None,
address: None,
link: None,
description: None,
comments: None,
tags: None,
};
let value = serde_json::to_value(&contact).unwrap();
assert_eq!(value["name"], "Alice");
assert_eq!(value["groups"], serde_json::json!([1, 2]));
}
}