use crate::internal::path_escape;
use crate::runtime::{self, Error};
#[derive(Clone, Debug, Default)]
pub struct MetadataTaxonomiesListOptions {
pub marker: Option<String>,
pub limit: Option<i64>,
}
#[derive(Clone, Debug, Default)]
pub struct MetadataTaxonomiesListNodesOptions {
pub level: Option<Vec<i64>>,
pub parent: Option<Vec<String>>,
pub ancestor: Option<Vec<String>>,
pub query: Option<String>,
pub include_total_result_count: Option<bool>,
pub marker: Option<String>,
pub limit: Option<i64>,
}
#[derive(Clone, Debug, Default)]
pub struct MetadataTaxonomiesListMetadataTemplateFieldOptionsOptions {
pub level: Option<Vec<i64>>,
pub parent: Option<Vec<String>>,
pub ancestor: Option<Vec<String>>,
pub query: Option<String>,
pub include_total_result_count: Option<bool>,
pub only_selectable_options: Option<bool>,
pub marker: Option<String>,
pub limit: Option<i64>,
}
pub struct MetadataTaxonomiesListPaginator {
manager: MetadataTaxonomiesManager,
namespace: String,
options: MetadataTaxonomiesListOptions,
buffer: std::vec::IntoIter<crate::models::schemas::MetadataTaxonomy>,
done: bool,
}
impl MetadataTaxonomiesListPaginator {
pub async fn next(
&mut self,
) -> Option<Result<crate::models::schemas::MetadataTaxonomy, Error>> {
loop {
if let Some(item) = self.buffer.next() {
return Some(Ok(item));
}
if self.done {
return None;
}
let page = match self
.manager
.list_page(self.namespace.clone(), Some(self.options.clone()))
.await
{
Ok(page) => page,
Err(err) => {
self.done = true;
return Some(Err(err));
}
};
self.buffer = page.entries.unwrap_or_default().into_iter();
match page.next_marker.flatten() {
Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
_ => self.done = true,
}
}
}
}
pub struct MetadataTaxonomiesListNodesPaginator {
manager: MetadataTaxonomiesManager,
namespace: String,
taxonomy_key: String,
options: MetadataTaxonomiesListNodesOptions,
buffer: std::vec::IntoIter<crate::models::schemas::MetadataTaxonomyNode>,
done: bool,
}
impl MetadataTaxonomiesListNodesPaginator {
pub async fn next(
&mut self,
) -> Option<Result<crate::models::schemas::MetadataTaxonomyNode, Error>> {
loop {
if let Some(item) = self.buffer.next() {
return Some(Ok(item));
}
if self.done {
return None;
}
let page = match self
.manager
.list_nodes_page(
self.namespace.clone(),
self.taxonomy_key.clone(),
Some(self.options.clone()),
)
.await
{
Ok(page) => page,
Err(err) => {
self.done = true;
return Some(Err(err));
}
};
self.buffer = page.entries.unwrap_or_default().into_iter();
match page.next_marker.flatten() {
Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
_ => self.done = true,
}
}
}
}
pub struct MetadataTaxonomiesListMetadataTemplateFieldOptionsPaginator {
manager: MetadataTaxonomiesManager,
namespace: String,
template_key: String,
field_key: String,
options: MetadataTaxonomiesListMetadataTemplateFieldOptionsOptions,
buffer: std::vec::IntoIter<crate::models::schemas::MetadataTaxonomyNode>,
done: bool,
}
impl MetadataTaxonomiesListMetadataTemplateFieldOptionsPaginator {
pub async fn next(
&mut self,
) -> Option<Result<crate::models::schemas::MetadataTaxonomyNode, Error>> {
loop {
if let Some(item) = self.buffer.next() {
return Some(Ok(item));
}
if self.done {
return None;
}
let page = match self
.manager
.list_metadata_template_field_options_page(
self.namespace.clone(),
self.template_key.clone(),
self.field_key.clone(),
Some(self.options.clone()),
)
.await
{
Ok(page) => page,
Err(err) => {
self.done = true;
return Some(Err(err));
}
};
self.buffer = page.entries.unwrap_or_default().into_iter();
match page.next_marker.flatten() {
Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
_ => self.done = true,
}
}
}
}
pub struct MetadataTaxonomiesManager {
session: std::sync::Arc<runtime::Client>,
}
impl MetadataTaxonomiesManager {
pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
Self { session }
}
pub async fn create(
&self,
body: crate::models::schemas::MetadataTaxonomyCreateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomy, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
let mut req = self.session.new_request("POST", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
async fn list_page(
&self,
namespace: String,
opts: Option<MetadataTaxonomiesListOptions>,
) -> Result<crate::models::schemas::MetadataTaxonomies, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
let mut req = self.session.new_request("GET", &url);
let opts = opts.unwrap_or_default();
if let Some(value) = opts.marker {
req = runtime::with_query(req, "marker", &value);
}
if let Some(value) = opts.limit {
req = runtime::with_query(req, "limit", &value.to_string());
}
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub fn list(
&self,
namespace: String,
opts: Option<MetadataTaxonomiesListOptions>,
) -> MetadataTaxonomiesListPaginator {
MetadataTaxonomiesListPaginator {
manager: MetadataTaxonomiesManager::new(self.session.clone()),
namespace,
options: opts.unwrap_or_default(),
buffer: Vec::new().into_iter(),
done: false,
}
}
pub async fn get(
&self,
namespace: String,
taxonomy_key: String,
) -> Result<crate::models::schemas::MetadataTaxonomy, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
let req = self.session.new_request("GET", &url);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn delete(&self, namespace: String, taxonomy_key: String) -> Result<(), Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
let req = self.session.new_request("DELETE", &url);
let _ = self.session.fetch(req).await?;
Ok(())
}
pub async fn update(
&self,
namespace: String,
taxonomy_key: String,
body: crate::models::schemas::MetadataTaxonomyUpdateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomy, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
let mut req = self.session.new_request("PATCH", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn create_levels(
&self,
namespace: String,
taxonomy_key: String,
body: Vec<crate::models::schemas::MetadataTaxonomyLevel>,
) -> Result<crate::models::schemas::MetadataTaxonomyLevels, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/levels");
let mut req = self.session.new_request("POST", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn update_level(
&self,
namespace: String,
taxonomy_key: String,
level_index: i64,
body: crate::models::schemas::LevelUpdateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomyLevel, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/levels");
url.push('/');
let seg = path_escape(&level_index.to_string());
url.push_str(&seg);
let mut req = self.session.new_request("PATCH", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn append_levels(
&self,
namespace: String,
taxonomy_key: String,
body: crate::models::schemas::LevelUpdateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomyLevels, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/levels:append");
let mut req = self.session.new_request("POST", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn trim_levels(
&self,
namespace: String,
taxonomy_key: String,
) -> Result<crate::models::schemas::MetadataTaxonomyLevels, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/levels:trim");
let req = self.session.new_request("POST", &url);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
async fn list_nodes_page(
&self,
namespace: String,
taxonomy_key: String,
opts: Option<MetadataTaxonomiesListNodesOptions>,
) -> Result<crate::models::schemas::MetadataTaxonomyNodes, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/nodes");
let mut req = self.session.new_request("GET", &url);
let opts = opts.unwrap_or_default();
if let Some(value) = opts.level {
let arg = crate::internal::join(&value, |v| v.to_string());
req = runtime::with_query(req, "level", &arg);
}
if let Some(value) = opts.parent {
req = runtime::with_query(req, "parent", &value.join(","));
}
if let Some(value) = opts.ancestor {
req = runtime::with_query(req, "ancestor", &value.join(","));
}
if let Some(value) = opts.query {
req = runtime::with_query(req, "query", &value);
}
if let Some(value) = opts.include_total_result_count {
req = runtime::with_query(req, "include-total-result-count", &value.to_string());
}
if let Some(value) = opts.marker {
req = runtime::with_query(req, "marker", &value);
}
if let Some(value) = opts.limit {
req = runtime::with_query(req, "limit", &value.to_string());
}
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub fn list_nodes(
&self,
namespace: String,
taxonomy_key: String,
opts: Option<MetadataTaxonomiesListNodesOptions>,
) -> MetadataTaxonomiesListNodesPaginator {
MetadataTaxonomiesListNodesPaginator {
manager: MetadataTaxonomiesManager::new(self.session.clone()),
namespace,
taxonomy_key,
options: opts.unwrap_or_default(),
buffer: Vec::new().into_iter(),
done: false,
}
}
pub async fn create_nodes(
&self,
namespace: String,
taxonomy_key: String,
body: crate::models::schemas::NodesCreateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomyNode, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/nodes");
let mut req = self.session.new_request("POST", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn get_node(
&self,
namespace: String,
taxonomy_key: String,
node_id: String,
) -> Result<crate::models::schemas::MetadataTaxonomyNode, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/nodes");
url.push('/');
let seg = path_escape(&node_id);
url.push_str(&seg);
let req = self.session.new_request("GET", &url);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub async fn delete_node(
&self,
namespace: String,
taxonomy_key: String,
node_id: String,
) -> Result<(), Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/nodes");
url.push('/');
let seg = path_escape(&node_id);
url.push_str(&seg);
let req = self.session.new_request("DELETE", &url);
let _ = self.session.fetch(req).await?;
Ok(())
}
pub async fn update_node(
&self,
namespace: String,
taxonomy_key: String,
node_id: String,
body: crate::models::schemas::NodeUpdateRequest,
) -> Result<crate::models::schemas::MetadataTaxonomyNode, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_taxonomies");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&taxonomy_key);
url.push_str(&seg);
url.push_str("/nodes");
url.push('/');
let seg = path_escape(&node_id);
url.push_str(&seg);
let mut req = self.session.new_request("PATCH", &url);
let payload = serde_json::to_vec(&body)?;
req = runtime::with_json_body(req, &payload);
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
async fn list_metadata_template_field_options_page(
&self,
namespace: String,
template_key: String,
field_key: String,
opts: Option<MetadataTaxonomiesListMetadataTemplateFieldOptionsOptions>,
) -> Result<crate::models::schemas::MetadataTaxonomyNodes, Error> {
let mut url = self.session.base_url("api");
url.push_str("/metadata_templates");
url.push('/');
let seg = path_escape(&namespace);
url.push_str(&seg);
url.push('/');
let seg = path_escape(&template_key);
url.push_str(&seg);
url.push_str("/fields");
url.push('/');
let seg = path_escape(&field_key);
url.push_str(&seg);
url.push_str("/options");
let mut req = self.session.new_request("GET", &url);
let opts = opts.unwrap_or_default();
if let Some(value) = opts.level {
let arg = crate::internal::join(&value, |v| v.to_string());
req = runtime::with_query(req, "level", &arg);
}
if let Some(value) = opts.parent {
req = runtime::with_query(req, "parent", &value.join(","));
}
if let Some(value) = opts.ancestor {
req = runtime::with_query(req, "ancestor", &value.join(","));
}
if let Some(value) = opts.query {
req = runtime::with_query(req, "query", &value);
}
if let Some(value) = opts.include_total_result_count {
req = runtime::with_query(req, "include-total-result-count", &value.to_string());
}
if let Some(value) = opts.only_selectable_options {
req = runtime::with_query(req, "only-selectable-options", &value.to_string());
}
if let Some(value) = opts.marker {
req = runtime::with_query(req, "marker", &value);
}
if let Some(value) = opts.limit {
req = runtime::with_query(req, "limit", &value.to_string());
}
let resp = self.session.fetch(req).await?;
let data = runtime::response_bytes(&resp)?;
Ok(serde_json::from_slice(&data)?)
}
pub fn list_metadata_template_field_options(
&self,
namespace: String,
template_key: String,
field_key: String,
opts: Option<MetadataTaxonomiesListMetadataTemplateFieldOptionsOptions>,
) -> MetadataTaxonomiesListMetadataTemplateFieldOptionsPaginator {
MetadataTaxonomiesListMetadataTemplateFieldOptionsPaginator {
manager: MetadataTaxonomiesManager::new(self.session.clone()),
namespace,
template_key,
field_key,
options: opts.unwrap_or_default(),
buffer: Vec::new().into_iter(),
done: false,
}
}
}