use serde::{Serialize, Serializer};
use serde_with::json::JsonString;
use serde_with::{serde_as, skip_serializing_none};
use crate::client::Client;
use crate::error::RsError;
use super::List;
#[derive(Debug)]
pub struct MetadataApi<'a> {
client: &'a Client,
}
impl<'a> MetadataApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn get_field_options(
&self,
request: GetFieldOptionsRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("get_field_options", reqwest::Method::GET, request)
.await
}
pub async fn get_node_id(
&self,
request: GetNodeIdRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("get_node_id", reqwest::Method::GET, request)
.await
}
pub async fn get_nodes(&self, request: GetNodesRequest) -> Result<serde_json::Value, RsError> {
self.client
.send_request("get_nodes", reqwest::Method::GET, request)
.await
}
pub async fn add_resource_nodes(
&self,
request: AddResourceNodesRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("add_resource_nodes", reqwest::Method::POST, request)
.await
}
pub async fn add_resource_nodes_multi(
&self,
request: AddResourceNodesMultiRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("add_resource_nodes_multi", reqwest::Method::POST, request)
.await
}
pub async fn set_node(&self, request: SetNodeRequest) -> Result<serde_json::Value, RsError> {
self.client
.send_request("set_node", reqwest::Method::POST, request)
.await
}
pub async fn get_resource_type_fields(
&self,
request: GetResourceTypeFieldsRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("get_resource_type_fields", reqwest::Method::GET, request)
.await
}
pub async fn create_resource_type_field(
&self,
request: CreateResourceTypeFieldRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("create_resource_type_field", reqwest::Method::POST, request)
.await
}
pub async fn toggle_active_state_for_nodes(
&self,
request: ToggleActiveStatesForNodesRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request(
"toggle_active_state_for_nodes",
reqwest::Method::POST,
request,
)
.await
}
pub async fn update_field(
&self,
request: UpdateFieldRequest,
) -> Result<serde_json::Value, RsError> {
self.client
.send_request("update_field", reqwest::Method::POST, request)
.await
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum FieldIdentifier {
Id(u32),
Shortname(String),
}
impl From<u32> for FieldIdentifier {
fn from(id: u32) -> Self {
Self::Id(id)
}
}
impl From<String> for FieldIdentifier {
fn from(name: String) -> Self {
Self::Shortname(name)
}
}
impl From<&str> for FieldIdentifier {
fn from(name: &str) -> Self {
Self::Shortname(name.to_string())
}
}
impl Serialize for FieldIdentifier {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Id(id) => id.serialize(serializer),
Self::Shortname(name) => name.serialize(serializer),
}
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct GetFieldOptionsRequest {
#[serde(rename = "ref")]
pub r#ref: FieldIdentifier,
pub nodeinfo: Option<bool>,
}
impl GetFieldOptionsRequest {
pub fn new(r#ref: impl Into<FieldIdentifier>) -> Self {
Self {
r#ref: r#ref.into(),
nodeinfo: None,
}
}
pub fn nodeinfo(mut self, nodeinfo: bool) -> Self {
self.nodeinfo = Some(nodeinfo);
self
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct GetNodeIdRequest {
pub value: String,
pub resource_type_field: u32,
}
impl GetNodeIdRequest {
pub fn new(value: impl Into<String>, resource_type_field: u32) -> Self {
Self {
value: value.into(),
resource_type_field,
}
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct GetNodesRequest {
#[serde(rename = "ref")]
pub r#ref: u32,
pub parent: Option<u32>,
pub recursive: Option<bool>,
pub offset: Option<u32>,
pub rows: Option<u32>,
pub name: Option<String>,
pub use_count: Option<bool>,
pub order_by_translated_name: Option<bool>,
}
impl GetNodesRequest {
pub fn new(r#ref: u32) -> Self {
Self {
r#ref,
parent: None,
recursive: None,
offset: None,
rows: None,
name: None,
use_count: None,
order_by_translated_name: None,
}
}
pub fn parent(mut self, parent: u32) -> Self {
self.parent = Some(parent);
self
}
pub fn recursive(mut self, recursive: bool) -> Self {
self.recursive = Some(recursive);
self
}
pub fn offset(mut self, offset: u32) -> Self {
self.offset = Some(offset);
self
}
pub fn rows(mut self, rows: u32) -> Self {
self.rows = Some(rows);
self
}
pub fn name(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
pub fn use_count(mut self, use_count: bool) -> Self {
self.use_count = Some(use_count);
self
}
pub fn order_by_translated_name(mut self, order_by_translated_name: bool) -> Self {
self.order_by_translated_name = Some(order_by_translated_name);
self
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct AddResourceNodesRequest {
pub resource: u32,
pub nodestring: List<u32>,
}
impl AddResourceNodesRequest {
pub fn new(resource: u32, nodestring: impl Into<List<u32>>) -> Self {
Self {
resource,
nodestring: nodestring.into(),
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct AddResourceNodesMultiRequest {
pub resourceid: List<u32>,
pub nodes: List<u32>,
}
impl AddResourceNodesMultiRequest {
pub fn new(resourceid: impl Into<List<u32>>, nodes: impl Into<List<u32>>) -> Self {
Self {
resourceid: resourceid.into(),
nodes: nodes.into(),
}
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct SetNodeRequest {
#[serde(rename = "ref")]
pub r#ref: u32,
pub resource_type_field: u32,
pub name: String,
pub parent: Option<String>,
pub order_by: Option<u32>,
pub returnexisting: Option<bool>,
}
impl SetNodeRequest {
pub fn new(r#ref: u32, resource_type_field: u32, name: impl Into<String>) -> Self {
Self {
r#ref,
resource_type_field,
name: name.into(),
parent: None,
order_by: None,
returnexisting: None,
}
}
pub fn parent(mut self, parent: impl Into<String>) -> Self {
self.parent = Some(parent.into());
self
}
pub fn order_by(mut self, order_by: u32) -> Self {
self.order_by = Some(order_by);
self
}
pub fn returnexisting(mut self, returnexisting: bool) -> Self {
self.returnexisting = Some(returnexisting);
self
}
}
#[skip_serializing_none]
#[derive(Clone, Debug, Default, PartialEq, Serialize)]
pub struct GetResourceTypeFieldsRequest {
pub by_resource_types: Option<List<u32>>,
pub find: Option<String>,
pub by_types: Option<List<u32>>,
}
impl GetResourceTypeFieldsRequest {
pub fn new() -> Self {
Self::default()
}
pub fn by_resource_types(mut self, by_resource_types: impl Into<List<u32>>) -> Self {
self.by_resource_types = Some(by_resource_types.into());
self
}
pub fn find(mut self, find: impl Into<String>) -> Self {
self.find = Some(find.into());
self
}
pub fn by_types(mut self, by_types: impl Into<List<u32>>) -> Self {
self.by_types = Some(by_types.into());
self
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct CreateResourceTypeFieldRequest {
pub name: String,
pub resource_types: List<u32>,
pub r#type: String,
}
impl CreateResourceTypeFieldRequest {
pub fn new(
name: impl Into<String>,
resource_types: impl Into<List<u32>>,
r#type: impl Into<String>,
) -> Self {
Self {
name: name.into(),
resource_types: resource_types.into(),
r#type: r#type.into(),
}
}
}
#[serde_as]
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct ToggleActiveStatesForNodesRequest {
#[serde_as(as = "JsonString")]
pub refs: Vec<u32>,
}
impl ToggleActiveStatesForNodesRequest {
pub fn new(refs: impl Into<List<u32>>) -> Self {
Self {
refs: refs.into().0,
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
pub struct UpdateFieldRequest {
pub resource: u32,
pub field: FieldIdentifier,
#[serde(flatten)]
pub value: FieldValue,
}
impl UpdateFieldRequest {
pub fn new(
resource: u32,
field: impl Into<FieldIdentifier>,
value: impl Into<FieldValue>,
) -> Self {
Self {
resource,
field: field.into(),
value: value.into(),
}
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum FieldValue {
Text(String),
Nodes(List<u32>),
}
impl From<&str> for FieldValue {
fn from(val: &str) -> Self {
Self::Text(val.to_string())
}
}
impl From<String> for FieldValue {
fn from(val: String) -> Self {
Self::Text(val)
}
}
impl From<u32> for FieldValue {
fn from(val: u32) -> Self {
Self::Nodes(List::from(val))
}
}
impl From<Vec<u32>> for FieldValue {
fn from(val: Vec<u32>) -> Self {
Self::Nodes(List::from(val))
}
}
impl<const N: usize> From<[u32; N]> for FieldValue {
fn from(val: [u32; N]) -> Self {
Self::Nodes(List::from(val))
}
}
impl Serialize for FieldValue {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeMap;
let mut map = serializer.serialize_map(None)?;
match self {
Self::Text(text) => {
map.serialize_entry("value", text)?;
}
Self::Nodes(nodes) => {
map.serialize_entry("value", nodes)?;
map.serialize_entry("nodevalues", &true)?;
}
}
map.end()
}
}