Skip to main content

fiberplane_models/
views.rs

1use crate::labels::Label;
2use crate::names::Name;
3use crate::paging::Pagination;
4use crate::sorting::{NotebookSortFields, SortDirection, Sorting, ViewSortFields};
5use crate::timestamps::Timestamp;
6use base64uuid::Base64Uuid;
7#[cfg(feature = "fp-bindgen")]
8use fp_bindgen::prelude::Serializable;
9use serde::{Deserialize, Serialize};
10use typed_builder::TypedBuilder;
11
12#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
13#[cfg_attr(
14    feature = "fp-bindgen",
15    derive(Serializable),
16    fp(rust_module = "fiberplane_models::views")
17)]
18#[non_exhaustive]
19#[serde(rename_all = "camelCase")]
20pub struct View {
21    #[builder(setter(into))]
22    pub id: Base64Uuid,
23
24    pub name: Name,
25
26    #[builder(default, setter(into))]
27    pub display_name: String,
28
29    #[builder(default, setter(into))]
30    pub description: String,
31
32    #[builder(default)]
33    pub color: i16,
34
35    #[builder(default)]
36    pub labels: Vec<Label>,
37
38    #[builder(default, setter(into, strip_option))]
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub relative_time: Option<RelativeTime>,
41
42    #[builder(default, setter(into, strip_option))]
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub sort_by: Option<NotebookSortFields>,
45
46    #[builder(default, setter(into, strip_option))]
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub sort_direction: Option<SortDirection>,
49
50    #[builder(setter(into))]
51    pub created_at: Timestamp,
52
53    #[builder(setter(into))]
54    pub updated_at: Timestamp,
55}
56
57#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
58#[non_exhaustive]
59#[serde(rename_all = "camelCase")]
60pub struct ViewQuery {
61    #[serde(flatten)]
62    pub sort: Sorting<ViewSortFields>,
63    #[serde(flatten)]
64    pub pagination: Pagination,
65}
66
67#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
68#[cfg_attr(
69    feature = "fp-bindgen",
70    derive(Serializable),
71    fp(rust_module = "fiberplane_models::views")
72)]
73#[non_exhaustive]
74#[serde(rename_all = "camelCase")]
75pub struct NewView {
76    pub name: Name,
77
78    #[builder(default, setter(into, strip_option))]
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub display_name: Option<String>,
81
82    #[builder(default, setter(into))]
83    pub description: String,
84
85    #[builder(default)]
86    pub color: i16,
87
88    #[builder(default)]
89    pub labels: Vec<Label>,
90
91    #[builder(default, setter(strip_option))]
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub relative_time: Option<RelativeTime>,
94
95    #[builder(default, setter(strip_option))]
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub sort_by: Option<NotebookSortFields>,
98
99    #[builder(default, setter(strip_option))]
100    #[serde(default, skip_serializing_if = "Option::is_none")]
101    pub sort_direction: Option<SortDirection>,
102}
103
104#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
105#[cfg_attr(
106    feature = "fp-bindgen",
107    derive(Serializable),
108    fp(rust_module = "fiberplane_models::views")
109)]
110#[non_exhaustive]
111#[serde(rename_all = "camelCase")]
112pub struct UpdateView {
113    #[builder(default, setter(into, strip_option))]
114    #[serde(default, skip_serializing_if = "Option::is_none")]
115    pub display_name: Option<String>,
116
117    #[builder(default, setter(strip_option))]
118    #[serde(
119        default,
120        deserialize_with = "crate::deserialize_some",
121        skip_serializing_if = "Option::is_none"
122    )]
123    pub description: Option<Option<String>>,
124
125    #[builder(default, setter(strip_option))]
126    #[serde(default, skip_serializing_if = "Option::is_none")]
127    pub color: Option<i16>,
128
129    #[builder(default, setter(strip_option))]
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub labels: Option<Vec<Label>>,
132
133    #[builder(default, setter(strip_option))]
134    #[serde(
135        default,
136        deserialize_with = "crate::deserialize_some",
137        skip_serializing_if = "Option::is_none"
138    )]
139    pub relative_time: Option<Option<RelativeTime>>,
140
141    #[builder(default, setter(strip_option))]
142    #[serde(
143        default,
144        deserialize_with = "crate::deserialize_some",
145        skip_serializing_if = "Option::is_none"
146    )]
147    pub sort_by: Option<Option<NotebookSortFields>>,
148
149    #[builder(default, setter(strip_option))]
150    #[serde(
151        default,
152        deserialize_with = "crate::deserialize_some",
153        skip_serializing_if = "Option::is_none"
154    )]
155    pub sort_direction: Option<Option<SortDirection>>,
156}
157
158#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, TypedBuilder)]
159#[cfg_attr(
160    feature = "fp-bindgen",
161    derive(Serializable),
162    fp(rust_module = "fiberplane_models::views")
163)]
164#[non_exhaustive]
165#[serde(rename_all = "camelCase")]
166pub struct PinnedView {
167    pub name: Name,
168}
169
170#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Copy, Clone)]
171#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
172#[cfg_attr(
173    feature = "fp-bindgen",
174    derive(Serializable),
175    fp(rust_module = "fiberplane_models::views")
176)]
177#[cfg_attr(feature = "sqlx", derive(sqlx::Type), sqlx(type_name = "time_unit"))]
178#[non_exhaustive]
179#[serde(rename_all = "camelCase")]
180pub enum TimeUnit {
181    Seconds,
182    Minutes,
183    Hours,
184    Days,
185}
186
187#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Copy, Clone)]
188#[cfg_attr(
189    feature = "fp-bindgen",
190    derive(Serializable),
191    fp(rust_module = "fiberplane_models::views")
192)]
193#[cfg_attr(
194    feature = "sqlx",
195    derive(sqlx::Type),
196    sqlx(type_name = "relative_time")
197)]
198#[non_exhaustive]
199#[serde(rename_all = "camelCase")]
200pub struct RelativeTime {
201    pub unit: TimeUnit,
202    pub value: i64,
203}
204
205impl RelativeTime {
206    /// Constructs a new relative time with the given `value` and `unit`.
207    pub fn new(value: i64, unit: TimeUnit) -> Self {
208        Self { unit, value }
209    }
210}