use std::collections::HashMap;
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use crate::{models::views::ViewReference, PropertyIdentifier};
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ItemId {
pub space: String,
pub external_id: String,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct ItemIdOptionalVersion {
pub space: String,
pub external_id: String,
pub version: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase", tag = "type")]
pub enum SourceReference {
View(ViewReference),
Container(ItemId),
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase", tag = "type")]
pub struct SourcePropertyReference {
pub source: SourceReference,
pub identifier: String,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct SpaceId {
pub space: String,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase", tag = "type")]
pub enum TaggedViewReference {
View(ViewReference),
}
impl From<ViewReference> for TaggedViewReference {
fn from(value: ViewReference) -> Self {
Self::View(value)
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase", tag = "type")]
pub enum TaggedContainerReference {
Container(ItemId),
}
impl TaggedContainerReference {
pub fn new(space: impl Into<String>, external_id: impl Into<String>) -> Self {
Self::Container(ItemId {
space: space.into(),
external_id: external_id.into(),
})
}
}
impl From<ItemId> for TaggedContainerReference {
fn from(value: ItemId) -> Self {
Self::Container(value)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub enum UsedFor {
#[default]
Node,
Edge,
Record,
All,
}
#[skip_serializing_none]
#[derive(Default, Serialize, Deserialize, Derivative, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct TextProperty {
#[derivative(Default(value = "false"))]
pub list: Option<bool>,
pub collation: Option<String>,
pub max_list_size: Option<i32>,
pub max_text_size: Option<i32>,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Derivative, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct UnitReference {
pub external_id: String,
pub source_unit: Option<String>,
}
#[skip_serializing_none]
#[derive(Default, Serialize, Deserialize, Derivative, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct PrimitiveProperty {
#[derivative(Default(value = "false"))]
pub list: Option<bool>,
pub unit: Option<UnitReference>,
pub max_list_size: Option<i32>,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Default, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct EnumValueDescription {
pub name: Option<String>,
pub description: Option<String>,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Default, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct EnumProperty {
pub unknown_value: Option<String>,
pub values: HashMap<String, EnumValueDescription>,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Derivative, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct CDFExternalIdReference {
#[derivative(Default(value = "false"))]
pub list: Option<bool>,
pub max_list_size: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
#[serde(rename_all = "camelCase")]
pub enum SortDirection {
#[default]
Ascending,
Descending,
}
#[skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct PropertySort {
pub property: Vec<String>,
pub direction: Option<SortDirection>,
pub nulls_first: Option<bool>,
}
impl PropertySort {
pub fn new(
property: impl PropertyIdentifier,
direction: SortDirection,
nulls_first: bool,
) -> Self {
Self {
property: property.into_identifier(),
direction: Some(direction),
nulls_first: Some(nulls_first),
}
}
}