1use std::collections::HashMap;
2
3use derivative::Derivative;
4use serde::{Deserialize, Serialize};
5use serde_with::skip_serializing_none;
6
7use crate::{
8 models::{
9 CDFExternalIdReference, PrimitiveProperty, TaggedContainerReference, TaggedViewReference,
10 TextProperty, UsedFor,
11 },
12 to_query, AdvancedFilter, IntoParams, RawValue, SetCursor,
13};
14
15use super::{
16 common::{EnumProperty, SourcePropertyReference},
17 instances::InstanceId,
18 query::QueryDirection,
19};
20
21#[derive(Serialize, Deserialize, Clone, Debug, Default)]
22#[serde(rename_all = "camelCase")]
23pub struct ViewReference {
25 pub space: String,
27 pub external_id: String,
29 pub version: String,
31}
32
33#[derive(Default, Clone, Debug)]
34pub struct ViewQuery {
36 pub limit: Option<i32>,
38 pub cursor: Option<String>,
40 pub space: Option<String>,
42 pub include_inherited_properties: Option<bool>,
44 pub all_versions: Option<bool>,
46 pub include_global: Option<bool>,
48}
49
50impl IntoParams for ViewQuery {
51 fn into_params(self) -> Vec<(String, String)> {
52 let mut params = Vec::<(String, String)>::new();
53 to_query("limit", &self.limit, &mut params);
54 to_query("cursor", &self.cursor, &mut params);
55 to_query("space", &self.space, &mut params);
56 to_query(
57 "includeInheritedProperties",
58 &self.include_inherited_properties,
59 &mut params,
60 );
61 to_query("allVersions", &self.all_versions, &mut params);
62 params
63 }
64}
65
66impl SetCursor for ViewQuery {
67 fn set_cursor(&mut self, cursor: Option<String>) {
68 self.cursor = cursor;
69 }
70}
71
72#[derive(Serialize, Deserialize, Clone, Debug)]
73#[serde(untagged)]
74pub enum ViewCreateOrReference {
76 Create(ViewCreateDefinition),
78 Reference(ViewReference),
80}
81
82impl From<ViewDefinitionOrReference> for ViewCreateOrReference {
83 fn from(value: ViewDefinitionOrReference) -> Self {
84 match value {
85 ViewDefinitionOrReference::Definition(x) => Self::Create(x.into()),
86 ViewDefinitionOrReference::Reference(x) => Self::Reference(x),
87 }
88 }
89}
90
91#[derive(Serialize, Deserialize, Clone, Debug)]
92#[serde(untagged)]
93pub enum ViewDefinitionOrReference {
95 Definition(ViewDefinition),
97 Reference(ViewReference),
99}
100
101#[skip_serializing_none]
102#[derive(Serialize, Deserialize, Clone, Debug, Default)]
103#[serde(rename_all = "camelCase")]
104pub struct ViewCreateDefinition {
106 pub external_id: String,
112 pub space: String,
114 pub name: Option<String>,
116 pub description: Option<String>,
118 pub filter: Option<AdvancedFilter>,
120 pub implements: Option<Vec<TaggedViewReference>>,
122 pub used_for: Option<UsedFor>,
124 pub version: String,
126 pub properties: HashMap<String, CreateViewPropertyOrConnectionDefinition>,
128}
129
130impl From<ViewDefinition> for ViewCreateDefinition {
131 fn from(value: ViewDefinition) -> Self {
132 Self {
133 external_id: value.external_id,
134 space: value.space,
135 name: value.name,
136 description: value.description,
137 implements: value.implements,
138 version: value.version,
139 used_for: Some(value.used_for),
140 filter: value.filter,
141 properties: value
142 .properties
143 .into_iter()
144 .map(|(key, val)| (key, val.into()))
145 .collect(),
146 }
147 }
148}
149
150#[skip_serializing_none]
151#[derive(Serialize, Deserialize, Clone, Debug)]
152#[serde(rename_all = "camelCase", untagged)]
153pub enum CreateViewPropertyOrConnectionDefinition {
155 CreateViewProperty(CreateViewProperty),
157 ConnectionDefinition(ConnectionDefinition),
159}
160
161impl From<ViewDefinitionProperties> for CreateViewPropertyOrConnectionDefinition {
162 fn from(value: ViewDefinitionProperties) -> Self {
163 match value {
164 ViewDefinitionProperties::ViewCorePropertyDefinition(p) => {
165 Self::CreateViewProperty(p.into())
166 }
167 ViewDefinitionProperties::ConnectionDefinition(d) => Self::ConnectionDefinition(d),
168 }
169 }
170}
171
172#[skip_serializing_none]
173#[derive(Serialize, Deserialize, Clone, Debug)]
174#[serde(rename_all = "camelCase")]
175pub struct CreateViewProperty {
177 pub name: Option<String>,
179 pub description: Option<String>,
181 pub container: TaggedContainerReference,
183 pub container_property_identifier: String,
185 pub source: Option<TaggedViewReference>,
187}
188
189impl From<ViewCorePropertyDefinition> for CreateViewProperty {
190 fn from(value: ViewCorePropertyDefinition) -> Self {
191 Self {
192 name: value.name,
193 description: value.description,
194 container: value.container,
195 container_property_identifier: value.container_property_identifier,
196 source: match value.r#type {
197 ViewCorePropertyType::Direct(v) => v.source,
198 _ => None,
199 },
200 }
201 }
202}
203
204#[skip_serializing_none]
205#[derive(Serialize, Deserialize, Clone, Debug)]
206#[serde(rename_all = "camelCase")]
207pub struct EdgeConnection {
209 pub name: Option<String>,
211 pub description: Option<String>,
213 pub r#type: InstanceId,
216 pub direction: Option<QueryDirection>,
218 pub source: TaggedViewReference,
220 pub edge_source: Option<TaggedViewReference>,
222}
223
224#[skip_serializing_none]
225#[derive(Serialize, Deserialize, Clone, Debug)]
226#[serde(rename_all = "camelCase")]
227pub struct ReverseDirectRelationConnection {
229 pub name: Option<String>,
231 pub description: Option<String>,
233 pub source: TaggedViewReference,
235 pub through: SourcePropertyReference,
237 pub targets_list: Option<bool>,
239}
240
241#[skip_serializing_none]
242#[derive(Serialize, Deserialize, Clone, Debug)]
243#[serde(rename_all = "snake_case", tag = "connectionType")]
244pub enum ConnectionDefinition {
247 SingleEdgeConnection(EdgeConnection),
249 MultiEdgeConnection(EdgeConnection),
251 SingleReverseDirectRelation(ReverseDirectRelationConnection),
253 MultiReverseDirectRelation(ReverseDirectRelationConnection),
255}
256
257#[skip_serializing_none]
258#[derive(Serialize, Deserialize, Clone, Debug, Default)]
259#[serde(rename_all = "camelCase")]
260pub struct ViewDefinition {
262 pub external_id: String,
264 pub space: String,
266 pub name: Option<String>,
268 pub description: Option<String>,
270 pub filter: Option<AdvancedFilter>,
272 pub implements: Option<Vec<TaggedViewReference>>,
274 pub version: String,
276 pub created_time: i64,
278 pub last_updated_time: i64,
280 pub writable: bool,
282 pub used_for: UsedFor,
284 pub properties: HashMap<String, ViewDefinitionProperties>,
286}
287
288#[skip_serializing_none]
289#[derive(Serialize, Deserialize, Clone, Debug)]
290#[serde(rename_all = "camelCase", untagged)]
291#[allow(clippy::large_enum_variant)]
292pub enum ViewDefinitionProperties {
294 ViewCorePropertyDefinition(ViewCorePropertyDefinition),
296 ConnectionDefinition(ConnectionDefinition),
298}
299
300#[derive(Serialize, Deserialize, Derivative, Clone, Debug, Copy)]
301#[serde(rename_all = "camelCase")]
302pub enum ConstraintOrIndexState {
304 Failed,
306 Current,
308 Pending,
310}
311
312#[derive(Serialize, Deserialize, Derivative, Clone, Debug, Default)]
313#[serde(rename_all = "camelCase")]
314pub struct ViewConstraintState {
316 pub nullability: Option<ConstraintOrIndexState>,
318}
319
320#[skip_serializing_none]
321#[derive(Serialize, Deserialize, Derivative, Clone, Debug)]
322#[serde(rename_all = "camelCase")]
323pub struct ViewCorePropertyDefinition {
325 #[derivative(Default(value = "true"))]
326 pub nullable: Option<bool>,
328 pub auto_increment: Option<bool>,
330 pub default_value: Option<RawValue>,
332 pub description: Option<String>,
334 pub name: Option<String>,
336 pub r#type: ViewCorePropertyType,
338 pub container: TaggedContainerReference,
340 pub container_property_identifier: String,
342 #[serde(default)]
343 pub immutable: bool,
345 #[serde(default)]
346 pub constraint_state: ViewConstraintState,
348}
349
350#[derive(Serialize, Deserialize, Derivative, Clone, Debug)]
351#[serde(rename_all = "lowercase", tag = "type")]
352pub enum ViewCorePropertyType {
354 Text(TextProperty),
356 Boolean(PrimitiveProperty),
358 Float32(PrimitiveProperty),
360 Float64(PrimitiveProperty),
362 Int32(PrimitiveProperty),
364 Int64(PrimitiveProperty),
366 Timestamp(PrimitiveProperty),
368 Date(PrimitiveProperty),
370 Json(PrimitiveProperty),
372 Timeseries(CDFExternalIdReference),
374 File(CDFExternalIdReference),
376 Sequence(CDFExternalIdReference),
378 Direct(ViewDirectNodeRelation),
380 Enum(EnumProperty),
382}
383
384#[skip_serializing_none]
385#[derive(Serialize, Deserialize, Derivative, Clone, Debug)]
386#[serde(rename_all = "camelCase")]
387pub struct ViewDirectNodeRelation {
390 pub container: Option<TaggedContainerReference>,
392 pub source: Option<TaggedViewReference>,
394 #[serde(default)]
395 pub list: bool,
397 pub max_list_size: Option<i32>,
399}