Skip to main content

hey_sdk/generated/
types.rs

1// Generated by hey-sdk-generator from openapi.json and behavior-model.json. DO NOT EDIT.
2
3#![allow(missing_docs, unreachable_pub, clippy::all, clippy::pedantic)]
4
5use std::collections::BTreeMap;
6
7use serde::{Deserialize, Serialize};
8
9use crate::types::{Date, DateTime, SensitiveString};
10
11/// Account — a HEY account
12#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
13#[non_exhaustive]
14pub struct Account {
15    #[serde(
16        default,
17        deserialize_with = "crate::types::null_as_default::deserialize"
18    )]
19    pub id: i64,
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub name: Option<String>,
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub domain: Option<String>,
24    #[serde(default, skip_serializing_if = "Option::is_none")]
25    pub status: Option<String>,
26    #[serde(default, skip_serializing_if = "Option::is_none")]
27    pub purpose: Option<String>,
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub trial: Option<bool>,
30    #[serde(
31        default,
32        with = "crate::types::optional_date",
33        skip_serializing_if = "Option::is_none"
34    )]
35    pub trial_ends_on: Option<Date>,
36    #[serde(default, skip_serializing_if = "Option::is_none")]
37    pub burner: Option<bool>,
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub readonly: Option<bool>,
40}
41
42#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
43pub struct AddPostingsToBoxGroupRequestContent {
44    #[serde(
45        default,
46        deserialize_with = "crate::types::null_as_default::deserialize"
47    )]
48    pub posting_ids: Vec<i64>,
49    #[serde(
50        default,
51        deserialize_with = "crate::types::null_as_default::deserialize"
52    )]
53    pub box_id: i64,
54    #[serde(
55        default,
56        deserialize_with = "crate::types::null_as_default::deserialize"
57    )]
58    pub box_group_id: i64,
59}
60
61/// Addressed recipients
62#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
63#[non_exhaustive]
64pub struct Addressed {
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub directly: Option<Vec<Contact>>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub copied: Option<Vec<Contact>>,
69    #[serde(default, skip_serializing_if = "Option::is_none")]
70    pub blindcopied: Option<Vec<Contact>>,
71}
72
73/// AddressedSender — sender context
74#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
75#[non_exhaustive]
76pub struct AddressedSender {
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub directly: Option<Vec<Contact>>,
79}
80
81/// AdvancedSearchFilters — the options the advanced search refine form offers
82#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
83#[non_exhaustive]
84pub struct AdvancedSearchFilters {
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub refine_in: Option<Vec<SearchFilterItem>>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub refine_dates: Option<Vec<SearchFilterItem>>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub refine_labels: Option<Vec<SearchFilterItem>>,
91    #[serde(default, skip_serializing_if = "Option::is_none")]
92    pub refine_attachments: Option<Vec<SearchFilterItem>>,
93}
94
95pub type AdvancedSearchResponseContent = AdvancedSearchResult;
96
97#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
98#[non_exhaustive]
99pub struct AdvancedSearchResult {
100    #[serde(
101        default,
102        deserialize_with = "crate::types::null_as_default::deserialize"
103    )]
104    pub matches: Vec<SearchMatch>,
105}
106
107/// AttachedEntry — entry reference on a calendar event
108#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
109#[non_exhaustive]
110pub struct AttachedEntry {
111    #[serde(
112        default,
113        deserialize_with = "crate::types::null_as_default::deserialize"
114    )]
115    pub id: i64,
116    #[serde(default, skip_serializing_if = "Option::is_none")]
117    pub kind: Option<String>,
118    #[serde(default, skip_serializing_if = "Option::is_none")]
119    pub title: Option<String>,
120    #[serde(default, skip_serializing_if = "Option::is_none")]
121    pub app_url: Option<String>,
122}
123
124/// Attendance — calendar event attendee
125#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
126#[non_exhaustive]
127pub struct Attendance {
128    #[serde(
129        default,
130        deserialize_with = "crate::types::null_as_default::deserialize"
131    )]
132    pub id: i64,
133    #[serde(default, skip_serializing_if = "Option::is_none")]
134    pub email_address: Option<String>,
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub status: Option<String>,
137    #[serde(default, skip_serializing_if = "Option::is_none")]
138    pub name: Option<String>,
139}
140
141#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
142#[non_exhaustive]
143pub struct BadRequestErrorResponseContent {
144    #[serde(
145        default,
146        deserialize_with = "crate::types::null_as_default::deserialize"
147    )]
148    pub message: String,
149}
150
151/// Box — a HEY mailbox
152#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
153#[non_exhaustive]
154pub struct Mailbox {
155    #[serde(
156        default,
157        deserialize_with = "crate::types::null_as_default::deserialize"
158    )]
159    pub id: i64,
160    #[serde(
161        default,
162        deserialize_with = "crate::types::null_as_default::deserialize"
163    )]
164    pub kind: String,
165    #[serde(
166        default,
167        deserialize_with = "crate::types::null_as_default::deserialize"
168    )]
169    pub name: String,
170    #[serde(default, skip_serializing_if = "Option::is_none")]
171    pub app_url: Option<String>,
172    #[serde(default, skip_serializing_if = "Option::is_none")]
173    pub url: Option<String>,
174    #[serde(default, skip_serializing_if = "Option::is_none")]
175    pub signed_stream_name: Option<String>,
176    #[serde(default, skip_serializing_if = "Option::is_none")]
177    pub posting_changes_url: Option<String>,
178    #[serde(default, skip_serializing_if = "Option::is_none")]
179    pub updates_channels: Option<Vec<UpdatesChannel>>,
180}
181
182/// BoxGroup — a Set Aside group. The API only ever returns the id.
183#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
184#[non_exhaustive]
185pub struct BoxGroup {
186    #[serde(
187        default,
188        deserialize_with = "crate::types::null_as_default::deserialize"
189    )]
190    pub id: i64,
191}
192
193/// BoxGroupWithPostings — a Set Aside group with one page of the postings in it
194#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
195#[non_exhaustive]
196pub struct BoxGroupWithPostings {
197    #[serde(
198        default,
199        deserialize_with = "crate::types::null_as_default::deserialize"
200    )]
201    pub id: i64,
202    #[serde(default, skip_serializing_if = "Option::is_none")]
203    pub box_id: Option<i64>,
204    #[serde(default, skip_serializing_if = "Option::is_none")]
205    pub postings: Option<Vec<Posting>>,
206}
207
208/// BoxGroupsResponse — the wrapper the groups index answers with
209#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
210#[non_exhaustive]
211pub struct BoxGroupsResponse {
212    #[serde(default, skip_serializing_if = "Option::is_none")]
213    pub box_groups: Option<Vec<BoxGroup>>,
214}
215
216/// BoxShowResponse — box detail with postings.
217/// The API can return fields at root level or nested under a `box` key.
218/// SDK response decoders normalize the nested variant to flat before decoding.
219#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
220#[non_exhaustive]
221pub struct BoxShowResponse {
222    #[serde(
223        default,
224        deserialize_with = "crate::types::null_as_default::deserialize"
225    )]
226    pub id: i64,
227    #[serde(
228        default,
229        deserialize_with = "crate::types::null_as_default::deserialize"
230    )]
231    pub kind: String,
232    #[serde(
233        default,
234        deserialize_with = "crate::types::null_as_default::deserialize"
235    )]
236    pub name: String,
237    #[serde(default, skip_serializing_if = "Option::is_none")]
238    pub app_url: Option<String>,
239    #[serde(default, skip_serializing_if = "Option::is_none")]
240    pub url: Option<String>,
241    #[serde(default, skip_serializing_if = "Option::is_none")]
242    pub signed_stream_name: Option<String>,
243    #[serde(default, skip_serializing_if = "Option::is_none")]
244    pub posting_changes_url: Option<String>,
245    #[serde(default, skip_serializing_if = "Option::is_none")]
246    pub updates_channels: Option<Vec<UpdatesChannel>>,
247    #[serde(default, skip_serializing_if = "Option::is_none")]
248    pub next_history_url: Option<String>,
249    #[serde(default, skip_serializing_if = "Option::is_none")]
250    pub next_incremental_sync_url: Option<String>,
251    #[serde(default, skip_serializing_if = "Option::is_none")]
252    pub postings: Option<Vec<Posting>>,
253}
254
255/// BubbleUpSchedule
256#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
257#[non_exhaustive]
258pub struct BubbleUpSchedule {
259    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
260    #[serde(default, skip_serializing_if = "Option::is_none")]
261    pub bubble_up_at: Option<DateTime>,
262    #[serde(default, skip_serializing_if = "Option::is_none")]
263    pub surprise_me: Option<bool>,
264}
265
266#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
267#[non_exhaustive]
268pub struct BulkReplyDelivery {
269    #[serde(
270        default,
271        deserialize_with = "crate::types::null_as_default::deserialize"
272    )]
273    pub id: i64,
274    #[serde(
275        default,
276        deserialize_with = "crate::types::null_as_default::deserialize"
277    )]
278    pub entries_count: i32,
279    /// True while the send is held open for undo.
280    #[serde(
281        default,
282        deserialize_with = "crate::types::null_as_default::deserialize"
283    )]
284    pub delayed: bool,
285    /// Where to POST to call the replies back, present only while delayed.
286    #[serde(default, skip_serializing_if = "Option::is_none")]
287    pub undo_send_url: Option<String>,
288}
289
290/// The reply as HEY would send it: the prefilled content and the entries it goes to.
291#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
292#[non_exhaustive]
293pub struct BulkReplyDraft {
294    /// The prefilled body — the name tag when every thread is on the same account.
295    #[serde(
296        default,
297        deserialize_with = "crate::types::null_as_default::deserialize"
298    )]
299    pub content: String,
300    #[serde(
301        default,
302        deserialize_with = "crate::types::null_as_default::deserialize"
303    )]
304    pub entries: Vec<BulkReplyEntry>,
305}
306
307/// One thread a bulk reply answers, with the recipients that thread's reply goes to.
308#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
309#[non_exhaustive]
310pub struct BulkReplyEntry {
311    #[serde(
312        default,
313        deserialize_with = "crate::types::null_as_default::deserialize"
314    )]
315    pub id: i64,
316    #[serde(
317        default,
318        deserialize_with = "crate::types::null_as_default::deserialize"
319    )]
320    pub topic_id: i64,
321    #[serde(
322        default,
323        deserialize_with = "crate::types::null_as_default::deserialize"
324    )]
325    pub topic_name: String,
326    #[serde(default)]
327    pub addressed: Addressed,
328}
329
330#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
331pub struct BulkReplyMessagePayload {
332    #[serde(
333        default,
334        deserialize_with = "crate::types::null_as_default::deserialize"
335    )]
336    pub content: String,
337}
338
339/// Wire format: {entry_ids: [...], message: {content}}
340#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
341pub struct BulkReplyRequestContent {
342    #[serde(
343        default,
344        deserialize_with = "crate::types::null_as_default::deserialize"
345    )]
346    pub entry_ids: Vec<i64>,
347    #[serde(default)]
348    pub message: BulkReplyMessagePayload,
349}
350
351#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
352pub struct BulkUpdateClearancesRequestContent {
353    #[serde(
354        default,
355        deserialize_with = "crate::types::null_as_default::deserialize"
356    )]
357    pub ids: String,
358    #[serde(
359        default,
360        deserialize_with = "crate::types::null_as_default::deserialize"
361    )]
362    pub status: String,
363    #[serde(default, skip_serializing_if = "Option::is_none")]
364    pub spam: Option<bool>,
365}
366
367pub type BulkUpdateClearancesResponseContent = ClearanceListResponse;
368
369/// Calendar
370#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
371#[non_exhaustive]
372pub struct Calendar {
373    #[serde(
374        default,
375        deserialize_with = "crate::types::null_as_default::deserialize"
376    )]
377    pub id: i64,
378    #[serde(default, skip_serializing_if = "Option::is_none")]
379    pub name: Option<String>,
380    #[serde(default, skip_serializing_if = "Option::is_none")]
381    pub kind: Option<String>,
382    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
383    #[serde(default, skip_serializing_if = "Option::is_none")]
384    pub created_at: Option<DateTime>,
385    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
386    #[serde(default, skip_serializing_if = "Option::is_none")]
387    pub updated_at: Option<DateTime>,
388    #[serde(default, skip_serializing_if = "Option::is_none")]
389    pub owned: Option<bool>,
390    #[serde(default, skip_serializing_if = "Option::is_none")]
391    pub color: Option<String>,
392    #[serde(default, skip_serializing_if = "Option::is_none")]
393    pub personal: Option<bool>,
394    #[serde(default, skip_serializing_if = "Option::is_none")]
395    pub external: Option<bool>,
396    #[serde(default, skip_serializing_if = "Option::is_none")]
397    pub url: Option<String>,
398    #[serde(default, skip_serializing_if = "Option::is_none")]
399    pub recordings_url: Option<String>,
400    #[serde(default, skip_serializing_if = "Option::is_none")]
401    pub occurrences_url: Option<String>,
402    #[serde(default, skip_serializing_if = "Option::is_none")]
403    pub owner_email_address: Option<String>,
404}
405
406#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
407#[non_exhaustive]
408pub struct CalendarDayListPayload {
409    #[serde(
410        default,
411        deserialize_with = "crate::types::null_as_default::deserialize"
412    )]
413    pub days: Vec<CalendarPeriod>,
414}
415
416/// CalendarListPayload
417#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
418#[non_exhaustive]
419pub struct CalendarListPayload {
420    #[serde(default, skip_serializing_if = "Option::is_none")]
421    pub calendars: Option<Vec<CalendarWithRecordingChangesUrl>>,
422    #[serde(default, skip_serializing_if = "Option::is_none")]
423    pub calendar_changes_url: Option<String>,
424    /// The calendars every period read is drawn from. ToggleCalendar changes this and
425    /// answers the new one, so a client reads it here once — to open on what is already
426    /// on — and takes it from the toggle after that.
427    #[serde(default, skip_serializing_if = "Option::is_none")]
428    pub selected_calendar_ids: Option<Vec<i64>>,
429}
430
431/// CalendarPeriod — a day or a week: its bounds and everything in it, grouped by type.
432/// Recurring events arrive expanded into the occurrences that fall inside the window,
433/// which is what makes this a different answer than the recordings a calendar lists.
434#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
435#[non_exhaustive]
436pub struct CalendarPeriod {
437    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
438    pub starts_at: DateTime,
439    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
440    pub ends_at: DateTime,
441    /// "day" or "week"
442    #[serde(
443        default,
444        deserialize_with = "crate::types::null_as_default::deserialize"
445    )]
446    pub kind: String,
447    #[serde(default)]
448    pub recordings: CalendarRecordingsResponse,
449}
450
451/// CalendarRecordingsResponse — recordings grouped by type
452pub type CalendarRecordingsResponse = BTreeMap<String, Vec<Recording>>;
453
454/// CalendarSelection — the calendars a toggle left switched on
455#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
456#[non_exhaustive]
457pub struct CalendarSelection {
458    #[serde(
459        default,
460        deserialize_with = "crate::types::null_as_default::deserialize"
461    )]
462    pub selected_calendar_ids: Vec<i64>,
463}
464
465/// Nothing here is required: a rename sends a title and leaves the day alone.
466#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
467pub struct CalendarTodoChanges {
468    #[serde(default, skip_serializing_if = "Option::is_none")]
469    pub title: Option<String>,
470    /// Date string (YYYY-MM-DD). The day the todo is filed on.
471    #[serde(default, skip_serializing_if = "Option::is_none")]
472    pub starts_at: Option<DateTime>,
473    #[serde(default, skip_serializing_if = "Option::is_none")]
474    pub focused: Option<bool>,
475}
476
477#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
478pub struct CalendarTodoPayload {
479    #[serde(
480        default,
481        deserialize_with = "crate::types::null_as_default::deserialize"
482    )]
483    pub title: String,
484    /// Date string (YYYY-MM-DD). Defaults to today if omitted.
485    #[serde(default, skip_serializing_if = "Option::is_none")]
486    pub starts_at: Option<DateTime>,
487}
488
489#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
490#[non_exhaustive]
491pub struct CalendarWeekListPayload {
492    #[serde(
493        default,
494        deserialize_with = "crate::types::null_as_default::deserialize"
495    )]
496    pub weeks: Vec<CalendarPeriod>,
497}
498
499/// CalendarWithRecordingChangesUrl — wraps calendar with sync URL
500#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
501#[non_exhaustive]
502pub struct CalendarWithRecordingChangesUrl {
503    #[serde(default, skip_serializing_if = "Option::is_none")]
504    pub calendar: Option<Calendar>,
505    #[serde(default, skip_serializing_if = "Option::is_none")]
506    pub recording_changes_url: Option<String>,
507}
508
509/// CalendarYear — the grid a year is drawn as. A year carries one entry per day plus the
510/// events that span more than one, not every recording it holds: a year's worth of
511/// expanded occurrences is not something a client asks for by opening a year.
512#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
513#[non_exhaustive]
514pub struct CalendarYear {
515    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
516    pub starts_at: DateTime,
517    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
518    pub ends_at: DateTime,
519    /// "year"
520    #[serde(
521        default,
522        deserialize_with = "crate::types::null_as_default::deserialize"
523    )]
524    pub kind: String,
525    /// Days between the reader's week start and January 1st, so the grid lines up
526    #[serde(
527        default,
528        deserialize_with = "crate::types::null_as_default::deserialize"
529    )]
530    pub padding_days_count: i32,
531    #[serde(
532        default,
533        deserialize_with = "crate::types::null_as_default::deserialize"
534    )]
535    pub days: Vec<CalendarYearDay>,
536    /// All-day and multi-day events, oldest first
537    #[serde(
538        default,
539        deserialize_with = "crate::types::null_as_default::deserialize"
540    )]
541    pub spanned_events: Vec<Recording>,
542}
543
544#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
545#[non_exhaustive]
546pub struct CalendarYearDay {
547    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
548    pub starts_at: DateTime,
549    #[serde(
550        default,
551        deserialize_with = "crate::types::null_as_default::deserialize"
552    )]
553    pub backgrounded: bool,
554}
555
556/// Clearance — screening status for a contact
557///
558/// petitioner and most_recent_entry are only filled in by the Screener reads. The
559/// contact reads answer a clearance with nothing but its id and status.
560#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
561#[non_exhaustive]
562pub struct Clearance {
563    #[serde(
564        default,
565        deserialize_with = "crate::types::null_as_default::deserialize"
566    )]
567    pub id: i64,
568    #[serde(default, skip_serializing_if = "Option::is_none")]
569    pub status: Option<String>,
570    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
571    #[serde(default, skip_serializing_if = "Option::is_none")]
572    pub created_at: Option<DateTime>,
573    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
574    #[serde(default, skip_serializing_if = "Option::is_none")]
575    pub updated_at: Option<DateTime>,
576    #[serde(default, skip_serializing_if = "Option::is_none")]
577    pub petitioner: Option<Contact>,
578    #[serde(default, skip_serializing_if = "Option::is_none")]
579    pub most_recent_entry: Option<Entry>,
580}
581
582/// ClearanceListResponse — wire format: {clearances: [...]}
583#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
584#[non_exhaustive]
585pub struct ClearanceListResponse {
586    #[serde(default, skip_serializing_if = "Option::is_none")]
587    pub clearances: Option<Vec<Clearance>>,
588}
589
590/// ClearanceSummary — the Screener's pending count, and the queue itself when asked for
591///
592/// clearances is only present when the read passes include_clearances. Without it HEY
593/// answers the count alone, which is what its own apps sync.
594#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
595#[non_exhaustive]
596pub struct ClearanceSummary {
597    #[serde(default, skip_serializing_if = "Option::is_none")]
598    pub pending_clearances_count: Option<i32>,
599    #[serde(default, skip_serializing_if = "Option::is_none")]
600    pub signed_stream_name: Option<String>,
601    #[serde(default, skip_serializing_if = "Option::is_none")]
602    pub clearances: Option<Vec<Clearance>>,
603}
604
605#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
606#[non_exhaustive]
607pub struct Clip {
608    #[serde(
609        default,
610        deserialize_with = "crate::types::null_as_default::deserialize"
611    )]
612    pub id: i64,
613    #[serde(default, skip_serializing_if = "Option::is_none")]
614    pub content: Option<String>,
615    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
616    #[serde(default, skip_serializing_if = "Option::is_none")]
617    pub created_at: Option<DateTime>,
618    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
619    #[serde(default, skip_serializing_if = "Option::is_none")]
620    pub updated_at: Option<DateTime>,
621    #[serde(default, skip_serializing_if = "Option::is_none")]
622    pub entry_id: Option<i64>,
623    #[serde(default, skip_serializing_if = "Option::is_none")]
624    pub topic: Option<ClipTopic>,
625}
626
627/// The topic a clip was taken from
628#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
629#[non_exhaustive]
630pub struct ClipTopic {
631    #[serde(
632        default,
633        deserialize_with = "crate::types::null_as_default::deserialize"
634    )]
635    pub id: i64,
636    #[serde(default, skip_serializing_if = "Option::is_none")]
637    pub name: Option<String>,
638    #[serde(default, skip_serializing_if = "Option::is_none")]
639    pub app_url: Option<String>,
640}
641
642/// Collection — email collection/label
643#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
644#[non_exhaustive]
645pub struct Collection {
646    #[serde(
647        default,
648        deserialize_with = "crate::types::null_as_default::deserialize"
649    )]
650    pub id: i64,
651    #[serde(default, skip_serializing_if = "Option::is_none")]
652    pub name: Option<String>,
653    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
654    #[serde(default, skip_serializing_if = "Option::is_none")]
655    pub created_at: Option<DateTime>,
656    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
657    #[serde(default, skip_serializing_if = "Option::is_none")]
658    pub updated_at: Option<DateTime>,
659    #[serde(default, skip_serializing_if = "Option::is_none")]
660    pub app_url: Option<String>,
661}
662
663#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
664pub struct CollectionPayload {
665    #[serde(default, skip_serializing_if = "Option::is_none")]
666    pub name: Option<String>,
667    #[serde(default, skip_serializing_if = "Option::is_none")]
668    pub summary: Option<String>,
669}
670
671/// CollectionWithPostings — collection detail with its threads as posting objects
672#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
673#[non_exhaustive]
674pub struct CollectionWithPostings {
675    #[serde(
676        default,
677        deserialize_with = "crate::types::null_as_default::deserialize"
678    )]
679    pub id: i64,
680    #[serde(default, skip_serializing_if = "Option::is_none")]
681    pub name: Option<String>,
682    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
683    #[serde(default, skip_serializing_if = "Option::is_none")]
684    pub created_at: Option<DateTime>,
685    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
686    #[serde(default, skip_serializing_if = "Option::is_none")]
687    pub updated_at: Option<DateTime>,
688    #[serde(default, skip_serializing_if = "Option::is_none")]
689    pub app_url: Option<String>,
690    #[serde(default, skip_serializing_if = "Option::is_none")]
691    pub postings: Option<Vec<Posting>>,
692}
693
694pub type CompleteCalendarTodoResponseContent = Recording;
695
696pub type CompleteHabitResponseContent = Recording;
697
698/// The request conflicts with current state, e.g. starting a time track while one is
699/// already ongoing. Time tracks answer {"error": "..."}; contact writes answer the
700/// {"errors": [...]} list every other error path uses.
701#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
702#[non_exhaustive]
703pub struct ConflictErrorResponseContent {
704    #[serde(default, skip_serializing_if = "Option::is_none")]
705    pub error: Option<String>,
706    #[serde(default, skip_serializing_if = "Option::is_none")]
707    pub errors: Option<Vec<String>>,
708    /// Contact writes only: the contact that was written -- a create that clashes
709    /// still creates the contact -- and the contacts already holding the email
710    /// addresses that were sent, so a client can offer the merge the web offers.
711    #[serde(default, skip_serializing_if = "Option::is_none")]
712    pub contact_id: Option<i64>,
713    #[serde(default, skip_serializing_if = "Option::is_none")]
714    pub conflicting_contact_ids: Option<Vec<i64>>,
715}
716
717/// Contact — the identity of someone in HEY
718#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
719#[non_exhaustive]
720pub struct Contact {
721    #[serde(
722        default,
723        deserialize_with = "crate::types::null_as_default::deserialize"
724    )]
725    pub id: i64,
726    #[serde(default, skip_serializing_if = "Option::is_none")]
727    pub account_id: Option<i64>,
728    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
729    #[serde(default, skip_serializing_if = "Option::is_none")]
730    pub updated_at: Option<DateTime>,
731    #[serde(default, skip_serializing_if = "Option::is_none")]
732    pub name: Option<String>,
733    #[serde(default, skip_serializing_if = "Option::is_none")]
734    pub email_address: Option<SensitiveString>,
735    #[serde(default, skip_serializing_if = "Option::is_none")]
736    pub avatar_url: Option<String>,
737    #[serde(default, skip_serializing_if = "Option::is_none")]
738    pub initials: Option<String>,
739    #[serde(default, skip_serializing_if = "Option::is_none")]
740    pub avatar_background_color: Option<String>,
741    #[serde(default, skip_serializing_if = "Option::is_none")]
742    pub contactable_type: Option<String>,
743    #[serde(default, skip_serializing_if = "Option::is_none")]
744    pub name_tag: Option<String>,
745}
746
747/// ContactDetail — extended contact with additional show fields
748#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
749#[non_exhaustive]
750pub struct ContactDetail {
751    #[serde(
752        default,
753        deserialize_with = "crate::types::null_as_default::deserialize"
754    )]
755    pub id: i64,
756    #[serde(default, skip_serializing_if = "Option::is_none")]
757    pub account_id: Option<i64>,
758    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
759    #[serde(default, skip_serializing_if = "Option::is_none")]
760    pub updated_at: Option<DateTime>,
761    #[serde(default, skip_serializing_if = "Option::is_none")]
762    pub name: Option<String>,
763    #[serde(default, skip_serializing_if = "Option::is_none")]
764    pub email_address: Option<SensitiveString>,
765    #[serde(default, skip_serializing_if = "Option::is_none")]
766    pub avatar_url: Option<String>,
767    #[serde(default, skip_serializing_if = "Option::is_none")]
768    pub initials: Option<String>,
769    #[serde(default, skip_serializing_if = "Option::is_none")]
770    pub avatar_background_color: Option<String>,
771    #[serde(default, skip_serializing_if = "Option::is_none")]
772    pub contactable_type: Option<String>,
773    #[serde(default, skip_serializing_if = "Option::is_none")]
774    pub name_tag: Option<String>,
775    #[serde(default, skip_serializing_if = "Option::is_none")]
776    pub edit_app_url: Option<String>,
777    #[serde(default, skip_serializing_if = "Option::is_none")]
778    pub clearance: Option<Clearance>,
779    #[serde(default, skip_serializing_if = "Option::is_none")]
780    pub aliases: Option<Vec<Contact>>,
781    #[serde(default, skip_serializing_if = "Option::is_none")]
782    pub domain: Option<Domain>,
783    /// The heading HEY gives the thread list, e.g. "All threads with GitHub"
784    #[serde(default, skip_serializing_if = "Option::is_none")]
785    pub entries_title: Option<String>,
786    /// One page of the threads this contact is on, newest first
787    #[serde(default, skip_serializing_if = "Option::is_none")]
788    pub postings: Option<Vec<Posting>>,
789}
790
791/// A contact's private note. Empty strings when there is no note.
792#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
793#[non_exhaustive]
794pub struct ContactNote {
795    #[serde(
796        default,
797        deserialize_with = "crate::types::null_as_default::deserialize"
798    )]
799    pub contact_id: i64,
800    #[serde(
801        default,
802        deserialize_with = "crate::types::null_as_default::deserialize"
803    )]
804    pub note: String,
805    /// The note as editor HTML, the same markup the web hands Trix.
806    #[serde(
807        default,
808        deserialize_with = "crate::types::null_as_default::deserialize"
809    )]
810    pub note_html: String,
811}
812
813#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
814pub struct ContactNotePayload {
815    #[serde(
816        default,
817        deserialize_with = "crate::types::null_as_default::deserialize"
818    )]
819    pub note: String,
820}
821
822/// Wire format: {contact: {note: "..."}}
823#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
824pub struct ContactNoteRequestContent {
825    #[serde(default)]
826    pub contact: ContactNotePayload,
827}
828
829#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
830pub struct ContactPayload {
831    #[serde(
832        default,
833        deserialize_with = "crate::types::null_as_default::deserialize"
834    )]
835    pub name: String,
836    #[serde(default, skip_serializing_if = "Option::is_none")]
837    pub email_address: Option<SensitiveString>,
838    /// Sending the list replaces it: an address left out stops being an alias.
839    #[serde(default, skip_serializing_if = "Option::is_none")]
840    pub alias_email_addresses: Option<Vec<String>>,
841}
842
843/// Wire format: {contact: {name, email_address, alias_email_addresses: [...]}}
844#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
845pub struct ContactRequestContent {
846    #[serde(default)]
847    pub contact: ContactPayload,
848}
849
850#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
851pub struct CreateBoxDesignationRequestContent {
852    #[serde(
853        default,
854        deserialize_with = "crate::types::null_as_default::deserialize"
855    )]
856    pub contact_id: i64,
857}
858
859#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
860pub struct CreateBoxGroupRequestContent {
861    #[serde(
862        default,
863        deserialize_with = "crate::types::null_as_default::deserialize"
864    )]
865    pub posting_ids: Vec<i64>,
866}
867
868pub type CreateBoxGroupResponseContent = BoxGroup;
869
870pub type CreateBulkReplyResponseContent = BulkReplyDelivery;
871
872/// Wire format: {calendar_todo: {title, starts_at}}
873#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
874pub struct CreateCalendarTodoRequestContent {
875    #[serde(default)]
876    pub calendar_todo: CalendarTodoPayload,
877}
878
879pub type CreateCalendarTodoResponseContent = Recording;
880
881/// Wire format: {acting_user_id, contact: {...}} — creating also has to say which account
882/// the contact belongs to, since one identity can hold several.
883#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
884pub struct CreateContactRequestContent {
885    /// The identity's user on the account the contact should be filed under; Identity's
886    /// all_users carries one per account. Left out, HEY files it under the first account.
887    #[serde(default, skip_serializing_if = "Option::is_none")]
888    pub acting_user_id: Option<i64>,
889    #[serde(default)]
890    pub contact: ContactPayload,
891}
892
893pub type CreateContactResponseContent = Contact;
894
895#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
896pub struct CreateDirectUploadRequestContent {
897    #[serde(default)]
898    pub blob: DirectUploadBlob,
899}
900
901/// Wire format: {posting_ids: [...], folder: {name, status}}
902#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
903pub struct CreateFolderForPostingsRequestContent {
904    #[serde(
905        default,
906        deserialize_with = "crate::types::null_as_default::deserialize"
907    )]
908    pub posting_ids: Vec<i64>,
909    #[serde(default)]
910    pub folder: FolderPayload,
911}
912
913pub type CreateHabitResponseContent = Recording;
914
915/// Wire format: {acting_sender_id, message: {subject, content}, entry: {addressed: {directly: "..."}}}
916#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
917pub struct CreateMessageRequestContent {
918    #[serde(
919        default,
920        deserialize_with = "crate::types::null_as_default::deserialize"
921    )]
922    pub acting_sender_id: i64,
923    #[serde(default)]
924    pub message: MessagePayload,
925    #[serde(default, skip_serializing_if = "Option::is_none")]
926    pub entry: Option<MessageEntryPayload>,
927}
928
929/// Wire format: {acting_sender_id, message: {subject, content}, entry: {addressed: {directly: [...]}}}
930/// entry.addressed is optional on the wire but a reply posted without it is saved as a
931/// draft rather than delivered — HEY does not reply-all for the caller. Resolve the
932/// thread's recipients first and always send them.
933#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
934pub struct CreateReplyRequestContent {
935    #[serde(
936        default,
937        deserialize_with = "crate::types::null_as_default::deserialize"
938    )]
939    pub acting_sender_id: i64,
940    #[serde(default)]
941    pub message: ReplyMessagePayload,
942    #[serde(default, skip_serializing_if = "Option::is_none")]
943    pub entry: Option<MessageEntryPayload>,
944}
945
946pub type CreateStickyResponseContent = Sticky;
947
948pub type CreateTimeTrackResponseContent = Recording;
949
950/// DeletedPosting — the stub the changes feed answers with for a posting that is gone
951#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
952#[non_exhaustive]
953pub struct DeletedPosting {
954    #[serde(
955        default,
956        deserialize_with = "crate::types::null_as_default::deserialize"
957    )]
958    pub id: i64,
959    #[serde(default, skip_serializing_if = "Option::is_none")]
960    pub box_id: Option<i64>,
961    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
962    #[serde(default, skip_serializing_if = "Option::is_none")]
963    pub deleted_at: Option<DateTime>,
964}
965
966#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
967#[non_exhaustive]
968pub struct DirectUpload {
969    #[serde(
970        default,
971        deserialize_with = "crate::types::null_as_default::deserialize"
972    )]
973    pub signed_id: String,
974    #[serde(
975        default,
976        deserialize_with = "crate::types::null_as_default::deserialize"
977    )]
978    pub attachable_sgid: String,
979    #[serde(default)]
980    pub direct_upload: DirectUploadTarget,
981}
982
983#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
984pub struct DirectUploadBlob {
985    #[serde(
986        default,
987        deserialize_with = "crate::types::null_as_default::deserialize"
988    )]
989    pub filename: String,
990    #[serde(
991        default,
992        deserialize_with = "crate::types::null_as_default::deserialize"
993    )]
994    pub byte_size: i64,
995    #[serde(
996        default,
997        deserialize_with = "crate::types::null_as_default::deserialize"
998    )]
999    pub checksum: String,
1000    #[serde(
1001        default,
1002        deserialize_with = "crate::types::null_as_default::deserialize"
1003    )]
1004    pub content_type: String,
1005}
1006
1007pub type DirectUploadHeaders = BTreeMap<String, String>;
1008
1009#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1010#[non_exhaustive]
1011pub struct DirectUploadTarget {
1012    #[serde(
1013        default,
1014        deserialize_with = "crate::types::null_as_default::deserialize"
1015    )]
1016    pub url: String,
1017    #[serde(default, skip_serializing_if = "Option::is_none")]
1018    pub headers: Option<DirectUploadHeaders>,
1019}
1020
1021/// Domain — email domain
1022#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1023#[non_exhaustive]
1024pub struct Domain {
1025    #[serde(
1026        default,
1027        deserialize_with = "crate::types::null_as_default::deserialize"
1028    )]
1029    pub id: i64,
1030    #[serde(default, skip_serializing_if = "Option::is_none")]
1031    pub address: Option<String>,
1032    #[serde(default, skip_serializing_if = "Option::is_none")]
1033    pub app_url: Option<String>,
1034    #[serde(default, skip_serializing_if = "Option::is_none")]
1035    pub avatar_url: Option<String>,
1036}
1037
1038/// DraftMessage — a draft entry
1039#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1040#[non_exhaustive]
1041pub struct DraftMessage {
1042    #[serde(
1043        default,
1044        deserialize_with = "crate::types::null_as_default::deserialize"
1045    )]
1046    pub id: i64,
1047    #[serde(default, skip_serializing_if = "Option::is_none")]
1048    pub subject: Option<String>,
1049    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1050    #[serde(default, skip_serializing_if = "Option::is_none")]
1051    pub updated_at: Option<DateTime>,
1052    #[serde(default, skip_serializing_if = "Option::is_none")]
1053    pub creator: Option<Contact>,
1054    #[serde(default, skip_serializing_if = "Option::is_none")]
1055    pub account_id: Option<i64>,
1056    #[serde(default, skip_serializing_if = "Option::is_none")]
1057    pub summary: Option<String>,
1058    #[serde(default, skip_serializing_if = "Option::is_none")]
1059    pub url: Option<String>,
1060    #[serde(default, skip_serializing_if = "Option::is_none")]
1061    pub app_url: Option<String>,
1062    #[serde(default, skip_serializing_if = "Option::is_none")]
1063    pub edit_url: Option<String>,
1064    #[serde(default, skip_serializing_if = "Option::is_none")]
1065    pub addressed_contacts: Option<Vec<Contact>>,
1066    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1067    #[serde(default, skip_serializing_if = "Option::is_none")]
1068    pub scheduled_delivery_at: Option<DateTime>,
1069}
1070
1071/// Entry — a message entry within a topic
1072#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1073#[non_exhaustive]
1074pub struct Entry {
1075    #[serde(
1076        default,
1077        deserialize_with = "crate::types::null_as_default::deserialize"
1078    )]
1079    pub id: i64,
1080    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1081    #[serde(default, skip_serializing_if = "Option::is_none")]
1082    pub created_at: Option<DateTime>,
1083    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1084    #[serde(default, skip_serializing_if = "Option::is_none")]
1085    pub updated_at: Option<DateTime>,
1086    #[serde(default, skip_serializing_if = "Option::is_none")]
1087    pub creator: Option<Contact>,
1088    #[serde(default, skip_serializing_if = "Option::is_none")]
1089    pub alternative_sender_name: Option<String>,
1090    #[serde(default, skip_serializing_if = "Option::is_none")]
1091    pub summary: Option<String>,
1092    #[serde(default, skip_serializing_if = "Option::is_none")]
1093    pub kind: Option<String>,
1094    #[serde(default, skip_serializing_if = "Option::is_none")]
1095    pub app_url: Option<String>,
1096    #[serde(default, skip_serializing_if = "Option::is_none")]
1097    pub subject: Option<String>,
1098    #[serde(default, skip_serializing_if = "Option::is_none")]
1099    pub topic_id: Option<i64>,
1100}
1101
1102/// Extenzion — external account extension
1103#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1104#[non_exhaustive]
1105pub struct Extenzion {
1106    #[serde(
1107        default,
1108        deserialize_with = "crate::types::null_as_default::deserialize"
1109    )]
1110    pub id: i64,
1111    #[serde(default, skip_serializing_if = "Option::is_none")]
1112    pub name: Option<String>,
1113    #[serde(default, skip_serializing_if = "Option::is_none")]
1114    pub app_url: Option<String>,
1115}
1116
1117#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1118#[non_exhaustive]
1119pub struct ExternalAccount {
1120    #[serde(
1121        default,
1122        deserialize_with = "crate::types::null_as_default::deserialize"
1123    )]
1124    pub id: i64,
1125    #[serde(default, skip_serializing_if = "Option::is_none")]
1126    pub contact: Option<Contact>,
1127}
1128
1129#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1130pub struct FilePostingsRequestContent {
1131    #[serde(
1132        default,
1133        deserialize_with = "crate::types::null_as_default::deserialize"
1134    )]
1135    pub posting_ids: Vec<i64>,
1136    #[serde(
1137        default,
1138        deserialize_with = "crate::types::null_as_default::deserialize"
1139    )]
1140    pub folder_id: i64,
1141}
1142
1143#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1144pub struct FirstWeekDayParams {
1145    /// Lowercase day name, sunday through saturday.
1146    #[serde(
1147        default,
1148        deserialize_with = "crate::types::null_as_default::deserialize"
1149    )]
1150    pub first_week_day: String,
1151}
1152
1153#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1154#[non_exhaustive]
1155pub struct FirstWeekDayPreference {
1156    /// 0 is Sunday through 6 Saturday, as GetIdentity serves it.
1157    #[serde(
1158        default,
1159        deserialize_with = "crate::types::null_as_default::deserialize"
1160    )]
1161    pub first_week_day: i32,
1162}
1163
1164/// Folder — email folder
1165#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1166#[non_exhaustive]
1167pub struct Folder {
1168    #[serde(
1169        default,
1170        deserialize_with = "crate::types::null_as_default::deserialize"
1171    )]
1172    pub id: i64,
1173    #[serde(default, skip_serializing_if = "Option::is_none")]
1174    pub name: Option<String>,
1175    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1176    #[serde(default, skip_serializing_if = "Option::is_none")]
1177    pub created_at: Option<DateTime>,
1178    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1179    #[serde(default, skip_serializing_if = "Option::is_none")]
1180    pub updated_at: Option<DateTime>,
1181    #[serde(default, skip_serializing_if = "Option::is_none")]
1182    pub app_url: Option<String>,
1183}
1184
1185#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1186pub struct FolderPayload {
1187    #[serde(
1188        default,
1189        deserialize_with = "crate::types::null_as_default::deserialize"
1190    )]
1191    pub name: String,
1192    #[serde(default, skip_serializing_if = "Option::is_none")]
1193    pub status: Option<String>,
1194}
1195
1196/// FolderWithPostings — folder detail with the postings filed in it
1197#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1198#[non_exhaustive]
1199pub struct FolderWithPostings {
1200    #[serde(
1201        default,
1202        deserialize_with = "crate::types::null_as_default::deserialize"
1203    )]
1204    pub id: i64,
1205    #[serde(default, skip_serializing_if = "Option::is_none")]
1206    pub name: Option<String>,
1207    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1208    #[serde(default, skip_serializing_if = "Option::is_none")]
1209    pub created_at: Option<DateTime>,
1210    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1211    #[serde(default, skip_serializing_if = "Option::is_none")]
1212    pub updated_at: Option<DateTime>,
1213    #[serde(default, skip_serializing_if = "Option::is_none")]
1214    pub app_url: Option<String>,
1215    #[serde(default, skip_serializing_if = "Option::is_none")]
1216    pub postings: Option<Vec<Posting>>,
1217}
1218
1219#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1220#[non_exhaustive]
1221pub struct ForbiddenErrorResponseContent {
1222    #[serde(
1223        default,
1224        deserialize_with = "crate::types::null_as_default::deserialize"
1225    )]
1226    pub message: String,
1227}
1228
1229pub type GetAdvancedSearchFiltersResponseContent = AdvancedSearchFilters;
1230
1231pub type GetAsideboxResponseContent = BoxShowResponse;
1232
1233pub type GetBoxGroupResponseContent = BoxGroupWithPostings;
1234
1235#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1236#[non_exhaustive]
1237pub struct GetBoxPostingChangesResponseContent {
1238    #[serde(default, skip_serializing_if = "Option::is_none")]
1239    pub added: Option<Vec<Posting>>,
1240    #[serde(default, skip_serializing_if = "Option::is_none")]
1241    pub updated: Option<Vec<Posting>>,
1242    #[serde(default, skip_serializing_if = "Option::is_none")]
1243    pub deleted: Option<Vec<DeletedPosting>>,
1244}
1245
1246pub type GetBoxResponseContent = BoxShowResponse;
1247
1248pub type GetBubbleboxResponseContent = BoxShowResponse;
1249
1250#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1251#[non_exhaustive]
1252pub struct GetBundleUnseenPostingsResponseContent {
1253    #[serde(default)]
1254    pub contact: Contact,
1255    #[serde(
1256        default,
1257        deserialize_with = "crate::types::null_as_default::deserialize"
1258    )]
1259    pub postings: Vec<Posting>,
1260}
1261
1262pub type GetCalendarDayResponseContent = CalendarPeriod;
1263
1264pub type GetCalendarRecordingsResponseContent = CalendarRecordingsResponse;
1265
1266pub type GetCalendarWeekResponseContent = CalendarPeriod;
1267
1268pub type GetCalendarYearResponseContent = CalendarYear;
1269
1270pub type GetClearancesResponseContent = ClearanceSummary;
1271
1272pub type GetCollectionResponseContent = CollectionWithPostings;
1273
1274pub type GetContactNoteResponseContent = ContactNote;
1275
1276pub type GetContactResponseContent = ContactDetail;
1277
1278pub type GetEverythingTopicsResponseContent = TopicListResponse;
1279
1280pub type GetFeedboxResponseContent = BoxShowResponse;
1281
1282pub type GetFolderResponseContent = FolderWithPostings;
1283
1284pub type GetIdentityResponseContent = Identity;
1285
1286pub type GetImboxResponseContent = BoxShowResponse;
1287
1288pub type GetImboxSeenResponseContent = BoxShowResponse;
1289
1290pub type GetJournalEntryResponseContent = Recording;
1291
1292pub type GetLaterboxResponseContent = BoxShowResponse;
1293
1294pub type GetMessageEditResponseContent = MessageEditState;
1295
1296pub type GetMessageResponseContent = Message;
1297
1298pub type GetMyClearancesResponseContent = ClearanceListResponse;
1299
1300pub type GetNavigationResponseContent = NavigationResponse;
1301
1302pub type GetOngoingTimeTrackResponseContent = Recording;
1303
1304pub type GetSentTopicsResponseContent = TopicListResponse;
1305
1306pub type GetSpamTopicsResponseContent = TopicListResponse;
1307
1308pub type GetTopicEntriesResponseContent = Vec<Entry>;
1309
1310pub type GetTopicPublicationResponseContent = TopicPublication;
1311
1312pub type GetTopicResponseContent = Topic;
1313
1314pub type GetTrailboxResponseContent = BoxShowResponse;
1315
1316pub type GetTrashTopicsResponseContent = TopicListResponse;
1317
1318pub type GetWorkflowResponseContent = Workflow;
1319
1320pub type GetWorkflowStageOutputPayload = String;
1321
1322#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1323pub struct HabitPayload {
1324    #[serde(default, skip_serializing_if = "Option::is_none")]
1325    pub name: Option<String>,
1326    #[serde(default, skip_serializing_if = "Option::is_none")]
1327    pub icon: Option<String>,
1328    #[serde(default, skip_serializing_if = "Option::is_none")]
1329    pub color: Option<String>,
1330    /// Days of the week the habit runs on, 0 for Sunday through 6 for Saturday
1331    #[serde(default, skip_serializing_if = "Option::is_none")]
1332    pub days: Option<Vec<i32>>,
1333}
1334
1335/// Wire format: {calendar_habit: {name, icon, color, days: [0..6]}}
1336#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1337pub struct HabitRequestContent {
1338    #[serde(default)]
1339    pub calendar_habit: HabitPayload,
1340}
1341
1342#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1343#[non_exhaustive]
1344pub struct Identity {
1345    #[serde(
1346        default,
1347        deserialize_with = "crate::types::null_as_default::deserialize"
1348    )]
1349    pub id: i64,
1350    #[serde(default, skip_serializing_if = "Option::is_none")]
1351    pub name: Option<String>,
1352    #[serde(default, skip_serializing_if = "Option::is_none")]
1353    pub avatar_url: Option<String>,
1354    #[serde(default, skip_serializing_if = "Option::is_none")]
1355    pub icon_url: Option<String>,
1356    #[serde(default, skip_serializing_if = "Option::is_none")]
1357    pub time_zone: Option<String>,
1358    #[serde(default, skip_serializing_if = "Option::is_none")]
1359    pub time_zone_name: Option<String>,
1360    #[serde(default, skip_serializing_if = "Option::is_none")]
1361    pub time_zone_offset: Option<i32>,
1362    #[serde(default, skip_serializing_if = "Option::is_none")]
1363    pub auto_time_zone: Option<bool>,
1364    #[serde(default, skip_serializing_if = "Option::is_none")]
1365    pub first_week_day: Option<i32>,
1366    #[serde(default, skip_serializing_if = "Option::is_none")]
1367    pub time_format: Option<String>,
1368    #[serde(default, skip_serializing_if = "Option::is_none")]
1369    pub primary_contact: Option<Contact>,
1370    #[serde(default, skip_serializing_if = "Option::is_none")]
1371    pub all_users: Option<Vec<User>>,
1372    #[serde(default, skip_serializing_if = "Option::is_none")]
1373    pub accounts: Option<Vec<Account>>,
1374    #[serde(default, skip_serializing_if = "Option::is_none")]
1375    pub senders: Option<Vec<Sender>>,
1376}
1377
1378#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1379#[non_exhaustive]
1380pub struct InternalServerErrorResponseContent {
1381    #[serde(
1382        default,
1383        deserialize_with = "crate::types::null_as_default::deserialize"
1384    )]
1385    pub message: String,
1386}
1387
1388/// JoinLink — video/meeting join link
1389#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1390#[non_exhaustive]
1391pub struct JoinLink {
1392    #[serde(default, skip_serializing_if = "Option::is_none")]
1393    pub title: Option<String>,
1394    #[serde(default, skip_serializing_if = "Option::is_none")]
1395    pub url: Option<String>,
1396}
1397
1398#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1399pub struct JournalEntryPayload {
1400    #[serde(
1401        default,
1402        deserialize_with = "crate::types::null_as_default::deserialize"
1403    )]
1404    pub content: String,
1405}
1406
1407pub type ListBoxGroupsResponseContent = BoxGroupsResponse;
1408
1409pub type ListBoxesResponseContent = Vec<Mailbox>;
1410
1411pub type ListCalendarDaysResponseContent = CalendarDayListPayload;
1412
1413pub type ListCalendarWeeksResponseContent = CalendarWeekListPayload;
1414
1415pub type ListCalendarsResponseContent = CalendarListPayload;
1416
1417pub type ListClipsResponseContent = Vec<Clip>;
1418
1419pub type ListCollectionsResponseContent = Vec<Collection>;
1420
1421pub type ListContactsResponseContent = Vec<Contact>;
1422
1423pub type ListDraftsResponseContent = Vec<DraftMessage>;
1424
1425pub type ListJournalEntriesResponseContent = Vec<Recording>;
1426
1427pub type ListSnippetsResponseContent = Vec<Snippet>;
1428
1429pub type ListStickiesResponseContent = Vec<Sticky>;
1430
1431pub type ListTimeTrackCategoriesResponseContent = Vec<TimeTrackCategory>;
1432
1433pub type ListTimeTracksResponseContent = TrackedTime;
1434
1435#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1436pub struct MarkPostingsRequestContent {
1437    #[serde(
1438        default,
1439        deserialize_with = "crate::types::null_as_default::deserialize"
1440    )]
1441    pub posting_ids: Vec<i64>,
1442}
1443
1444/// Message — full message detail
1445#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1446#[non_exhaustive]
1447pub struct Message {
1448    #[serde(
1449        default,
1450        deserialize_with = "crate::types::null_as_default::deserialize"
1451    )]
1452    pub id: i64,
1453    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1454    #[serde(default, skip_serializing_if = "Option::is_none")]
1455    pub created_at: Option<DateTime>,
1456    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1457    #[serde(default, skip_serializing_if = "Option::is_none")]
1458    pub updated_at: Option<DateTime>,
1459    #[serde(default, skip_serializing_if = "Option::is_none")]
1460    pub url: Option<String>,
1461    #[serde(default, skip_serializing_if = "Option::is_none")]
1462    pub creator: Option<Contact>,
1463    #[serde(default, skip_serializing_if = "Option::is_none")]
1464    pub sender: Option<Contact>,
1465    #[serde(default, skip_serializing_if = "Option::is_none")]
1466    pub is_reply: Option<bool>,
1467    #[serde(default, skip_serializing_if = "Option::is_none")]
1468    pub subject: Option<String>,
1469    #[serde(default, skip_serializing_if = "Option::is_none")]
1470    pub content: Option<String>,
1471    #[serde(default, skip_serializing_if = "Option::is_none")]
1472    pub addressed: Option<Addressed>,
1473    #[serde(default, skip_serializing_if = "Option::is_none")]
1474    pub show_addressed_selector: Option<bool>,
1475    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1476    #[serde(default, skip_serializing_if = "Option::is_none")]
1477    pub scheduled_delivery_at: Option<DateTime>,
1478    #[serde(default, skip_serializing_if = "Option::is_none")]
1479    pub posting: Option<MessagePostingContext>,
1480    #[serde(default, skip_serializing_if = "Option::is_none")]
1481    pub addressed_sender: Option<AddressedSender>,
1482}
1483
1484/// Recipients per kind, each a list of email addresses.
1485/// haystack applies Array() to each kind, so a JSON array is the correct wire format
1486/// (a bare string would be treated as a single address, not split on commas).
1487#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1488pub struct MessageAddressed {
1489    #[serde(default, skip_serializing_if = "Option::is_none")]
1490    pub directly: Option<Vec<String>>,
1491    #[serde(default, skip_serializing_if = "Option::is_none")]
1492    pub copied: Option<Vec<String>>,
1493    #[serde(default, skip_serializing_if = "Option::is_none")]
1494    pub blindcopied: Option<Vec<String>>,
1495}
1496
1497/// MessageDraft — a prefilled compose payload (forward, reply). Unsent, so it has no id.
1498#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1499#[non_exhaustive]
1500pub struct MessageDraft {
1501    #[serde(default, skip_serializing_if = "Option::is_none")]
1502    pub url: Option<String>,
1503    #[serde(default, skip_serializing_if = "Option::is_none")]
1504    pub creator: Option<Contact>,
1505    #[serde(default, skip_serializing_if = "Option::is_none")]
1506    pub sender: Option<Contact>,
1507    #[serde(default, skip_serializing_if = "Option::is_none")]
1508    pub is_reply: Option<bool>,
1509    #[serde(default, skip_serializing_if = "Option::is_none")]
1510    pub subject: Option<String>,
1511    #[serde(default, skip_serializing_if = "Option::is_none")]
1512    pub content: Option<String>,
1513    #[serde(default, skip_serializing_if = "Option::is_none")]
1514    pub addressed: Option<Addressed>,
1515    #[serde(default, skip_serializing_if = "Option::is_none")]
1516    pub show_addressed_selector: Option<bool>,
1517    #[serde(default, skip_serializing_if = "Option::is_none")]
1518    pub posting: Option<MessagePostingContext>,
1519    #[serde(default, skip_serializing_if = "Option::is_none")]
1520    pub addressed_sender: Option<AddressedSender>,
1521}
1522
1523/// MessageEditState — a saved draft as the editor sees it. The same compose fields as
1524/// MessageDraft, plus the identity and scheduling a saved entry carries.
1525#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1526#[non_exhaustive]
1527pub struct MessageEditState {
1528    #[serde(
1529        default,
1530        deserialize_with = "crate::types::null_as_default::deserialize"
1531    )]
1532    pub id: i64,
1533    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1534    #[serde(default, skip_serializing_if = "Option::is_none")]
1535    pub created_at: Option<DateTime>,
1536    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1537    #[serde(default, skip_serializing_if = "Option::is_none")]
1538    pub updated_at: Option<DateTime>,
1539    #[serde(default, skip_serializing_if = "Option::is_none")]
1540    pub url: Option<String>,
1541    #[serde(default, skip_serializing_if = "Option::is_none")]
1542    pub creator: Option<Contact>,
1543    #[serde(default, skip_serializing_if = "Option::is_none")]
1544    pub sender: Option<Contact>,
1545    #[serde(default, skip_serializing_if = "Option::is_none")]
1546    pub is_reply: Option<bool>,
1547    #[serde(default, skip_serializing_if = "Option::is_none")]
1548    pub subject: Option<String>,
1549    #[serde(default, skip_serializing_if = "Option::is_none")]
1550    pub content: Option<String>,
1551    #[serde(default, skip_serializing_if = "Option::is_none")]
1552    pub addressed: Option<Addressed>,
1553    #[serde(default, skip_serializing_if = "Option::is_none")]
1554    pub show_addressed_selector: Option<bool>,
1555    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1556    #[serde(default, skip_serializing_if = "Option::is_none")]
1557    pub scheduled_delivery_at: Option<DateTime>,
1558    #[serde(default, skip_serializing_if = "Option::is_none")]
1559    pub posting: Option<MessagePostingContext>,
1560    #[serde(default, skip_serializing_if = "Option::is_none")]
1561    pub addressed_sender: Option<AddressedSender>,
1562}
1563
1564#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1565pub struct MessageEntryPayload {
1566    #[serde(default, skip_serializing_if = "Option::is_none")]
1567    pub addressed: Option<MessageAddressed>,
1568    /// "drafted" saves the entry as a draft instead of delivering it. Any other value
1569    /// (or omitting it) delivers through the undo-delay window.
1570    #[serde(default, skip_serializing_if = "Option::is_none")]
1571    pub status: Option<String>,
1572    /// "true" schedules delivery for the date and hour below; the entry stays drafted
1573    /// with a scheduled_delivery_at until then. On an update, omitting it clears an
1574    /// existing scheduled delivery.
1575    #[serde(default, skip_serializing_if = "Option::is_none")]
1576    pub scheduled_delivery: Option<String>,
1577    /// The delivery date: YYYY-MM-DD, "today" or "tomorrow", read in the identity's
1578    /// time zone.
1579    #[serde(default, skip_serializing_if = "Option::is_none")]
1580    pub scheduled_delivery_at_date: Option<String>,
1581    /// The delivery hour, "0" through "23" — a string so that midnight survives
1582    /// omitempty. HEY schedules to the hour.
1583    #[serde(default, skip_serializing_if = "Option::is_none")]
1584    pub scheduled_delivery_at_hour: Option<String>,
1585}
1586
1587#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1588pub struct MessagePayload {
1589    #[serde(
1590        default,
1591        deserialize_with = "crate::types::null_as_default::deserialize"
1592    )]
1593    pub subject: String,
1594    #[serde(
1595        default,
1596        deserialize_with = "crate::types::null_as_default::deserialize"
1597    )]
1598    pub content: String,
1599}
1600
1601/// MessagePostingContext — posting context for a message
1602#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1603#[non_exhaustive]
1604pub struct MessagePostingContext {
1605    #[serde(default, skip_serializing_if = "Option::is_none")]
1606    pub r#box: Option<String>,
1607}
1608
1609#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1610pub struct MovePostingsRequestContent {
1611    #[serde(
1612        default,
1613        deserialize_with = "crate::types::null_as_default::deserialize"
1614    )]
1615    pub posting_ids: Vec<i64>,
1616    #[serde(
1617        default,
1618        deserialize_with = "crate::types::null_as_default::deserialize"
1619    )]
1620    pub box_id: i64,
1621}
1622
1623/// Wire format: {id, position} — both at the top level.
1624#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1625pub struct MoveStickyRequestContent {
1626    #[serde(
1627        default,
1628        deserialize_with = "crate::types::null_as_default::deserialize"
1629    )]
1630    pub id: i64,
1631    #[serde(
1632        default,
1633        deserialize_with = "crate::types::null_as_default::deserialize"
1634    )]
1635    pub position: i32,
1636}
1637
1638#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1639pub struct MoveTopicRequestContent {
1640    #[serde(
1641        default,
1642        deserialize_with = "crate::types::null_as_default::deserialize"
1643    )]
1644    pub box_id: i64,
1645}
1646
1647#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1648pub struct MoveWorkflowStagingRequestContent {
1649    #[serde(default)]
1650    pub workflow_staging: WorkflowStagingPayload,
1651}
1652
1653/// NavigationIcon
1654#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1655#[non_exhaustive]
1656pub struct NavigationIcon {
1657    #[serde(default, skip_serializing_if = "Option::is_none")]
1658    pub name: Option<String>,
1659    #[serde(default, skip_serializing_if = "Option::is_none")]
1660    pub android_url: Option<String>,
1661    #[serde(default, skip_serializing_if = "Option::is_none")]
1662    pub ios_url: Option<String>,
1663}
1664
1665/// NavigationItem
1666#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1667#[non_exhaustive]
1668pub struct NavigationItem {
1669    #[serde(default, skip_serializing_if = "Option::is_none")]
1670    pub title: Option<String>,
1671    #[serde(default, skip_serializing_if = "Option::is_none")]
1672    pub app_url: Option<String>,
1673    #[serde(default, skip_serializing_if = "Option::is_none")]
1674    pub platform: Option<String>,
1675    #[serde(default, skip_serializing_if = "Option::is_none")]
1676    pub hotkey: Option<String>,
1677    #[serde(default, skip_serializing_if = "Option::is_none")]
1678    pub highlighted: Option<bool>,
1679    #[serde(default, skip_serializing_if = "Option::is_none")]
1680    pub icon: Option<NavigationIcon>,
1681    #[serde(default, skip_serializing_if = "Option::is_none")]
1682    pub menu_items: Option<Vec<NavigationItem>>,
1683}
1684
1685/// NavigationResponse
1686#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1687#[non_exhaustive]
1688pub struct NavigationResponse {
1689    #[serde(default, skip_serializing_if = "Option::is_none")]
1690    pub items: Option<Vec<NavigationItem>>,
1691    #[serde(default, skip_serializing_if = "Option::is_none")]
1692    pub hotkeys: Option<Vec<NavigationItem>>,
1693}
1694
1695pub type NewBulkReplyResponseContent = BulkReplyDraft;
1696
1697pub type NewEntryForwardResponseContent = MessageDraft;
1698
1699pub type NewEntryReplyResponseContent = MessageDraft;
1700
1701#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1702#[non_exhaustive]
1703pub struct NotFoundErrorResponseContent {
1704    #[serde(
1705        default,
1706        deserialize_with = "crate::types::null_as_default::deserialize"
1707    )]
1708    pub message: String,
1709}
1710
1711/// Organizer — calendar event organizer
1712#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1713#[non_exhaustive]
1714pub struct Organizer {
1715    #[serde(default, skip_serializing_if = "Option::is_none")]
1716    pub email_address: Option<String>,
1717    #[serde(default, skip_serializing_if = "Option::is_none")]
1718    pub name: Option<String>,
1719}
1720
1721/// Posting — polymorphic by `kind` (topic, bundle, entry)
1722#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1723#[non_exhaustive]
1724pub struct Posting {
1725    #[serde(
1726        default,
1727        deserialize_with = "crate::types::null_as_default::deserialize"
1728    )]
1729    pub id: i64,
1730    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1731    #[serde(default, skip_serializing_if = "Option::is_none")]
1732    pub created_at: Option<DateTime>,
1733    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1734    #[serde(default, skip_serializing_if = "Option::is_none")]
1735    pub updated_at: Option<DateTime>,
1736    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1737    #[serde(default, skip_serializing_if = "Option::is_none")]
1738    pub observed_at: Option<DateTime>,
1739    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1740    #[serde(default, skip_serializing_if = "Option::is_none")]
1741    pub active_at: Option<DateTime>,
1742    #[serde(default, skip_serializing_if = "Option::is_none")]
1743    pub box_id: Option<i64>,
1744    #[serde(default, skip_serializing_if = "Option::is_none")]
1745    pub account_id: Option<i64>,
1746    /// Discriminator: "topic", "bundle", or "entry"
1747    #[serde(
1748        default,
1749        deserialize_with = "crate::types::null_as_default::deserialize"
1750    )]
1751    pub kind: String,
1752    #[serde(default, skip_serializing_if = "Option::is_none")]
1753    pub seen: Option<bool>,
1754    #[serde(default, skip_serializing_if = "Option::is_none")]
1755    pub bundled: Option<bool>,
1756    #[serde(default, skip_serializing_if = "Option::is_none")]
1757    pub muted: Option<bool>,
1758    #[serde(default, skip_serializing_if = "Option::is_none")]
1759    pub note: Option<PostingNote>,
1760    #[serde(default, skip_serializing_if = "Option::is_none")]
1761    pub preapproved_clearance: Option<bool>,
1762    #[serde(default, skip_serializing_if = "Option::is_none")]
1763    pub box_group_id: Option<i64>,
1764    #[serde(default, skip_serializing_if = "Option::is_none")]
1765    pub includes_attachments: Option<bool>,
1766    #[serde(default, skip_serializing_if = "Option::is_none")]
1767    pub includes_calendar_invites: Option<bool>,
1768    #[serde(default, skip_serializing_if = "Option::is_none")]
1769    pub bubbled_up: Option<bool>,
1770    #[serde(default, skip_serializing_if = "Option::is_none")]
1771    pub bubble_up_waiting_on: Option<bool>,
1772    #[serde(default, skip_serializing_if = "Option::is_none")]
1773    pub bubble_up_schedule: Option<BubbleUpSchedule>,
1774    #[serde(default, skip_serializing_if = "Option::is_none")]
1775    pub creator: Option<Contact>,
1776    #[serde(default, skip_serializing_if = "Option::is_none")]
1777    pub app_url: Option<String>,
1778    #[serde(default, skip_serializing_if = "Option::is_none")]
1779    pub summary: Option<String>,
1780    #[serde(default, skip_serializing_if = "Option::is_none")]
1781    pub alternative_sender_name: Option<String>,
1782    #[serde(default, skip_serializing_if = "Option::is_none")]
1783    pub name: Option<String>,
1784    #[serde(default, skip_serializing_if = "Option::is_none")]
1785    pub blocked_trackers: Option<bool>,
1786    #[serde(default, skip_serializing_if = "Option::is_none")]
1787    pub contacts: Option<Vec<Contact>>,
1788    #[serde(default, skip_serializing_if = "Option::is_none")]
1789    pub extenzions: Option<Vec<Extenzion>>,
1790    #[serde(default, skip_serializing_if = "Option::is_none")]
1791    pub folders: Option<Vec<Folder>>,
1792    #[serde(default, skip_serializing_if = "Option::is_none")]
1793    pub collections: Option<Vec<Collection>>,
1794    #[serde(default, skip_serializing_if = "Option::is_none")]
1795    pub workflows: Option<Vec<Workflow>>,
1796    #[serde(default, skip_serializing_if = "Option::is_none")]
1797    pub visible_entry_count: Option<i32>,
1798    #[serde(default, skip_serializing_if = "Option::is_none")]
1799    pub entry_kind: Option<String>,
1800    #[serde(default, skip_serializing_if = "Option::is_none")]
1801    pub addressed_contacts: Option<Vec<Contact>>,
1802    #[serde(default, skip_serializing_if = "Option::is_none")]
1803    pub app_bundle_url: Option<String>,
1804}
1805
1806impl Posting {
1807    pub fn is_topic(&self) -> bool {
1808        self.kind == "topic"
1809    }
1810
1811    pub fn is_bundle(&self) -> bool {
1812        self.kind == "bundle"
1813    }
1814
1815    pub fn is_entry(&self) -> bool {
1816        self.kind == "entry"
1817    }
1818}
1819
1820/// Note — a posting note
1821#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1822#[non_exhaustive]
1823pub struct PostingNote {
1824    #[serde(
1825        default,
1826        deserialize_with = "crate::types::null_as_default::deserialize"
1827    )]
1828    pub id: i64,
1829    #[serde(default, skip_serializing_if = "Option::is_none")]
1830    pub content: Option<String>,
1831}
1832
1833/// Recording — polymorphic by `type` (Calendar::Event, Calendar::Todo, etc.)
1834#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1835#[non_exhaustive]
1836pub struct Recording {
1837    #[serde(
1838        default,
1839        deserialize_with = "crate::types::null_as_default::deserialize"
1840    )]
1841    pub id: i64,
1842    #[serde(default, skip_serializing_if = "Option::is_none")]
1843    pub parent_id: Option<i64>,
1844    #[serde(default, skip_serializing_if = "Option::is_none")]
1845    pub title: Option<String>,
1846    #[serde(default, skip_serializing_if = "Option::is_none")]
1847    pub all_day: Option<bool>,
1848    #[serde(default, skip_serializing_if = "Option::is_none")]
1849    pub recurring: Option<bool>,
1850    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1851    #[serde(default, skip_serializing_if = "Option::is_none")]
1852    pub starts_at: Option<DateTime>,
1853    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1854    #[serde(default, skip_serializing_if = "Option::is_none")]
1855    pub ends_at: Option<DateTime>,
1856    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1857    #[serde(default, skip_serializing_if = "Option::is_none")]
1858    pub created_at: Option<DateTime>,
1859    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1860    #[serde(default, skip_serializing_if = "Option::is_none")]
1861    pub updated_at: Option<DateTime>,
1862    /// Discriminator — the recordable's Ruby class name: Calendar::Event, Calendar::Todo,
1863    /// Calendar::JournalEntry, Calendar::Habit, Calendar::TimeTrack, Calendar::Countdown,
1864    /// Calendar::DayBackground, Calendar::DayTitle or Calendar::Habit::Completion.
1865    #[serde(
1866        default,
1867        deserialize_with = "crate::types::null_as_default::deserialize"
1868    )]
1869    pub r#type: String,
1870    #[serde(default, skip_serializing_if = "Option::is_none")]
1871    pub parent: Option<::std::boxed::Box<Recording>>,
1872    #[serde(default, skip_serializing_if = "Option::is_none")]
1873    pub starts_at_time_zone: Option<String>,
1874    #[serde(default, skip_serializing_if = "Option::is_none")]
1875    pub ends_at_time_zone: Option<String>,
1876    #[serde(default, skip_serializing_if = "Option::is_none")]
1877    pub reminders_label: Option<String>,
1878    #[serde(default, skip_serializing_if = "Option::is_none")]
1879    pub reminders: Option<Vec<Reminder>>,
1880    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1881    #[serde(default, skip_serializing_if = "Option::is_none")]
1882    pub completed_at: Option<DateTime>,
1883    #[serde(default, skip_serializing_if = "Option::is_none")]
1884    pub highlighted: Option<bool>,
1885    #[serde(default, skip_serializing_if = "Option::is_none")]
1886    pub recurrence_schedule: Option<RecurrenceSchedule>,
1887    #[serde(default, skip_serializing_if = "Option::is_none")]
1888    pub occurrences_url: Option<String>,
1889    #[serde(default, skip_serializing_if = "Option::is_none")]
1890    pub occurrence_id: Option<String>,
1891    #[serde(default, skip_serializing_if = "Option::is_none")]
1892    pub calendar: Option<Calendar>,
1893    #[serde(default, skip_serializing_if = "Option::is_none")]
1894    pub edit_url: Option<String>,
1895    #[serde(default, skip_serializing_if = "Option::is_none")]
1896    pub summary: Option<String>,
1897    #[serde(default, skip_serializing_if = "Option::is_none")]
1898    pub url: Option<String>,
1899    #[serde(default, skip_serializing_if = "Option::is_none")]
1900    pub location: Option<String>,
1901    #[serde(default, skip_serializing_if = "Option::is_none")]
1902    pub manage_attendance: Option<bool>,
1903    #[serde(default, skip_serializing_if = "Option::is_none")]
1904    pub attendance_status: Option<String>,
1905    #[serde(default, skip_serializing_if = "Option::is_none")]
1906    pub organizer: Option<Organizer>,
1907    #[serde(default, skip_serializing_if = "Option::is_none")]
1908    pub attendances: Option<Vec<Attendance>>,
1909    #[serde(default, skip_serializing_if = "Option::is_none")]
1910    pub attendances_summary: Option<String>,
1911    #[serde(default, skip_serializing_if = "Option::is_none")]
1912    pub description: Option<String>,
1913    #[serde(default, skip_serializing_if = "Option::is_none")]
1914    pub join_link: Option<JoinLink>,
1915    #[serde(default, skip_serializing_if = "Option::is_none")]
1916    pub attached_entry: Option<AttachedEntry>,
1917    #[serde(default, skip_serializing_if = "Option::is_none")]
1918    pub position: Option<i32>,
1919    #[serde(default, skip_serializing_if = "Option::is_none")]
1920    pub content: Option<String>,
1921    /// Full rich-text HTML of a journal entry (GetJournalEntry / UpdateJournalEntry only;
1922    /// listings carry a truncated plain-text `content` instead).
1923    #[serde(default, skip_serializing_if = "Option::is_none")]
1924    pub content_html: Option<String>,
1925    #[serde(default, skip_serializing_if = "Option::is_none")]
1926    pub color: Option<String>,
1927    #[serde(default, skip_serializing_if = "Option::is_none")]
1928    pub icon: Option<String>,
1929    #[serde(default, skip_serializing_if = "Option::is_none")]
1930    pub days: Option<Vec<i32>>,
1931    #[serde(default, skip_serializing_if = "Option::is_none")]
1932    pub icon_url: Option<String>,
1933    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
1934    #[serde(default, skip_serializing_if = "Option::is_none")]
1935    pub stopped_at: Option<DateTime>,
1936    #[serde(default, skip_serializing_if = "Option::is_none")]
1937    pub notes: Option<String>,
1938    #[serde(default, skip_serializing_if = "Option::is_none")]
1939    pub category: Option<String>,
1940    #[serde(default, skip_serializing_if = "Option::is_none")]
1941    pub label: Option<String>,
1942    #[serde(default, skip_serializing_if = "Option::is_none")]
1943    pub image_url: Option<String>,
1944}
1945
1946impl Recording {
1947    pub fn is_calendar_event(&self) -> bool {
1948        self.r#type == "Calendar::Event"
1949    }
1950
1951    pub fn is_calendar_todo(&self) -> bool {
1952        self.r#type == "Calendar::Todo"
1953    }
1954
1955    pub fn is_calendar_journal_entry(&self) -> bool {
1956        self.r#type == "Calendar::JournalEntry"
1957    }
1958
1959    pub fn is_calendar_habit(&self) -> bool {
1960        self.r#type == "Calendar::Habit"
1961    }
1962
1963    pub fn is_calendar_time_track(&self) -> bool {
1964        self.r#type == "Calendar::TimeTrack"
1965    }
1966
1967    pub fn is_calendar_countdown(&self) -> bool {
1968        self.r#type == "Calendar::Countdown"
1969    }
1970
1971    pub fn is_calendar_day_background(&self) -> bool {
1972        self.r#type == "Calendar::DayBackground"
1973    }
1974}
1975
1976/// RecurrenceSchedule
1977#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1978#[non_exhaustive]
1979pub struct RecurrenceSchedule {
1980    #[serde(default, skip_serializing_if = "Option::is_none")]
1981    pub kind: Option<String>,
1982    #[serde(default, skip_serializing_if = "Option::is_none")]
1983    pub description: Option<String>,
1984    #[serde(default, skip_serializing_if = "Option::is_none")]
1985    pub preset: Option<bool>,
1986}
1987
1988/// Reminder
1989#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
1990#[non_exhaustive]
1991pub struct Reminder {
1992    #[serde(
1993        default,
1994        deserialize_with = "crate::types::null_as_default::deserialize"
1995    )]
1996    pub id: i64,
1997    #[serde(default, skip_serializing_if = "Option::is_none")]
1998    pub summary: Option<String>,
1999    #[serde(default, skip_serializing_if = "Option::is_none")]
2000    pub duration: Option<i32>,
2001    #[serde(default, skip_serializing_if = "Option::is_none")]
2002    pub default_duration: Option<bool>,
2003    #[serde(default, skip_serializing_if = "Option::is_none")]
2004    pub iso8601_duration: Option<String>,
2005    #[serde(default, skip_serializing_if = "Option::is_none")]
2006    pub delivered: Option<bool>,
2007    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2008    #[serde(default, skip_serializing_if = "Option::is_none")]
2009    pub remind_at: Option<DateTime>,
2010    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2011    #[serde(default, skip_serializing_if = "Option::is_none")]
2012    pub created_at: Option<DateTime>,
2013    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2014    #[serde(default, skip_serializing_if = "Option::is_none")]
2015    pub updated_at: Option<DateTime>,
2016    #[serde(default, skip_serializing_if = "Option::is_none")]
2017    pub label: Option<String>,
2018}
2019
2020/// HEY does not derive a subject for a reply: a reply draft saved without message.subject
2021/// reads "No subject" in Drafts. NewEntryReply hands back the prefilled subject ("Re: …") —
2022/// send it here. Content is the caller's reply body alone: the server appends the quoted
2023/// original at delivery (auto_quoting defaults on), so the prefill's quoted content must
2024/// not be echoed back.
2025#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2026pub struct ReplyMessagePayload {
2027    #[serde(default, skip_serializing_if = "Option::is_none")]
2028    pub subject: Option<String>,
2029    #[serde(
2030        default,
2031        deserialize_with = "crate::types::null_as_default::deserialize"
2032    )]
2033    pub content: String,
2034}
2035
2036pub type RevealContactResponseContent = Contact;
2037
2038#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2039pub struct SchedulePostingsBubbleUpRequestContent {
2040    #[serde(
2041        default,
2042        deserialize_with = "crate::types::null_as_default::deserialize"
2043    )]
2044    pub posting_ids: Vec<i64>,
2045    #[serde(
2046        default,
2047        deserialize_with = "crate::types::null_as_default::deserialize"
2048    )]
2049    pub slot: String,
2050    #[serde(default, skip_serializing_if = "Option::is_none")]
2051    pub date: Option<String>,
2052}
2053
2054/// SearchFilterItem — one option offered by the advanced search refine form
2055#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2056#[non_exhaustive]
2057pub struct SearchFilterItem {
2058    #[serde(default, skip_serializing_if = "Option::is_none")]
2059    pub title: Option<String>,
2060    #[serde(default, skip_serializing_if = "Option::is_none")]
2061    pub value: Option<String>,
2062}
2063
2064/// One matching topic: the topic, your posting of it (if any), and the entries that matched.
2065#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2066#[non_exhaustive]
2067pub struct SearchMatch {
2068    #[serde(default)]
2069    pub topic: Topic,
2070    #[serde(default, skip_serializing_if = "Option::is_none")]
2071    pub posting_id: Option<i64>,
2072    #[serde(default, skip_serializing_if = "Option::is_none")]
2073    pub entries: Option<Vec<Entry>>,
2074}
2075
2076/// Sender — a contact with default flag
2077#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2078#[non_exhaustive]
2079pub struct Sender {
2080    #[serde(
2081        default,
2082        deserialize_with = "crate::types::null_as_default::deserialize"
2083    )]
2084    pub id: i64,
2085    #[serde(default, skip_serializing_if = "Option::is_none")]
2086    pub account_id: Option<i64>,
2087    #[serde(default, skip_serializing_if = "Option::is_none")]
2088    pub name: Option<String>,
2089    #[serde(default, skip_serializing_if = "Option::is_none")]
2090    pub email_address: Option<SensitiveString>,
2091    #[serde(default, skip_serializing_if = "Option::is_none")]
2092    pub avatar_url: Option<String>,
2093    #[serde(default, skip_serializing_if = "Option::is_none")]
2094    pub initials: Option<String>,
2095    #[serde(default, skip_serializing_if = "Option::is_none")]
2096    pub avatar_background_color: Option<String>,
2097    #[serde(default, skip_serializing_if = "Option::is_none")]
2098    pub contactable_type: Option<String>,
2099    #[serde(default, skip_serializing_if = "Option::is_none")]
2100    pub name_tag: Option<String>,
2101    #[serde(default, skip_serializing_if = "Option::is_none")]
2102    pub default: Option<bool>,
2103}
2104
2105#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2106#[non_exhaustive]
2107pub struct ServiceUnavailableErrorResponseContent {
2108    #[serde(
2109        default,
2110        deserialize_with = "crate::types::null_as_default::deserialize"
2111    )]
2112    pub message: String,
2113}
2114
2115#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2116#[non_exhaustive]
2117pub struct Snippet {
2118    #[serde(
2119        default,
2120        deserialize_with = "crate::types::null_as_default::deserialize"
2121    )]
2122    pub id: i64,
2123    #[serde(default, skip_serializing_if = "Option::is_none")]
2124    pub name: Option<String>,
2125    /// Plain text
2126    #[serde(default, skip_serializing_if = "Option::is_none")]
2127    pub content: Option<String>,
2128    /// Rich-text HTML
2129    #[serde(default, skip_serializing_if = "Option::is_none")]
2130    pub content_html: Option<String>,
2131    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2132    #[serde(default, skip_serializing_if = "Option::is_none")]
2133    pub created_at: Option<DateTime>,
2134    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2135    #[serde(default, skip_serializing_if = "Option::is_none")]
2136    pub updated_at: Option<DateTime>,
2137}
2138
2139pub type StartTimeTrackResponseContent = Recording;
2140
2141/// Sticky — a note on the stickies board
2142#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2143#[non_exhaustive]
2144pub struct Sticky {
2145    #[serde(
2146        default,
2147        deserialize_with = "crate::types::null_as_default::deserialize"
2148    )]
2149    pub id: i64,
2150    #[serde(default, skip_serializing_if = "Option::is_none")]
2151    pub body: Option<String>,
2152    #[serde(default, skip_serializing_if = "Option::is_none")]
2153    pub size: Option<String>,
2154    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2155    #[serde(default, skip_serializing_if = "Option::is_none")]
2156    pub created_at: Option<DateTime>,
2157    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2158    #[serde(default, skip_serializing_if = "Option::is_none")]
2159    pub updated_at: Option<DateTime>,
2160}
2161
2162#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2163pub struct StickyPayload {
2164    #[serde(default, skip_serializing_if = "Option::is_none")]
2165    pub body: Option<String>,
2166    #[serde(default, skip_serializing_if = "Option::is_none")]
2167    pub size: Option<String>,
2168}
2169
2170/// Wire format: {sticky: {body, size}}. Size is "small", "medium" or "large".
2171#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2172pub struct StickyRequestContent {
2173    #[serde(default)]
2174    pub sticky: StickyPayload,
2175}
2176
2177#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2178#[non_exhaustive]
2179pub struct TimeFormatPreference {
2180    /// "twelve_hour" or "twenty_four_hour", as GetIdentity serves it.
2181    #[serde(
2182        default,
2183        deserialize_with = "crate::types::null_as_default::deserialize"
2184    )]
2185    pub time_format: String,
2186}
2187
2188#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2189#[non_exhaustive]
2190pub struct TimeTrackCategory {
2191    #[serde(
2192        default,
2193        deserialize_with = "crate::types::null_as_default::deserialize"
2194    )]
2195    pub id: i64,
2196    #[serde(default, skip_serializing_if = "Option::is_none")]
2197    pub title: Option<String>,
2198    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2199    #[serde(default, skip_serializing_if = "Option::is_none")]
2200    pub created_at: Option<DateTime>,
2201    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2202    #[serde(default, skip_serializing_if = "Option::is_none")]
2203    pub updated_at: Option<DateTime>,
2204}
2205
2206#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2207pub struct TimeTrackRequestContent {
2208    pub starts_at: DateTime,
2209    pub ends_at: DateTime,
2210    #[serde(default, skip_serializing_if = "Option::is_none")]
2211    pub category_title: Option<String>,
2212    #[serde(default, skip_serializing_if = "Option::is_none")]
2213    pub notes: Option<String>,
2214}
2215
2216pub type ToggleCalendarResponseContent = CalendarSelection;
2217
2218/// Topic detail
2219#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2220#[non_exhaustive]
2221pub struct Topic {
2222    #[serde(
2223        default,
2224        deserialize_with = "crate::types::null_as_default::deserialize"
2225    )]
2226    pub id: i64,
2227    #[serde(default, skip_serializing_if = "Option::is_none")]
2228    pub name: Option<String>,
2229    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2230    #[serde(default, skip_serializing_if = "Option::is_none")]
2231    pub created_at: Option<DateTime>,
2232    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2233    #[serde(default, skip_serializing_if = "Option::is_none")]
2234    pub updated_at: Option<DateTime>,
2235    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2236    #[serde(default, skip_serializing_if = "Option::is_none")]
2237    pub active_at: Option<DateTime>,
2238    #[serde(default, skip_serializing_if = "Option::is_none")]
2239    pub status: Option<String>,
2240    #[serde(default, skip_serializing_if = "Option::is_none")]
2241    pub account_id: Option<i64>,
2242    #[serde(default, skip_serializing_if = "Option::is_none")]
2243    pub app_url: Option<String>,
2244    #[serde(default, skip_serializing_if = "Option::is_none")]
2245    pub creator: Option<Contact>,
2246    #[serde(default, skip_serializing_if = "Option::is_none")]
2247    pub contacts: Option<Vec<Contact>>,
2248    #[serde(default, skip_serializing_if = "Option::is_none")]
2249    pub extenzions: Option<Vec<Extenzion>>,
2250    #[serde(default, skip_serializing_if = "Option::is_none")]
2251    pub collections: Option<Vec<Collection>>,
2252    #[serde(default, skip_serializing_if = "Option::is_none")]
2253    pub is_forged_sender: Option<bool>,
2254    #[serde(default, skip_serializing_if = "Option::is_none")]
2255    pub latest_entry: Option<Entry>,
2256    /// The topic's first page of entries (summaries, no bodies). Present on GetTopic; use
2257    /// GetTopicEntries for the rest and GetMessage for a body.
2258    #[serde(default, skip_serializing_if = "Option::is_none")]
2259    pub entries: Option<Vec<Entry>>,
2260}
2261
2262/// TopicListResponse — wrapped topic list (sent, spam, trash, everything)
2263#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2264#[non_exhaustive]
2265pub struct TopicListResponse {
2266    #[serde(default, skip_serializing_if = "Option::is_none")]
2267    pub title: Option<String>,
2268    #[serde(default, skip_serializing_if = "Option::is_none")]
2269    pub description: Option<String>,
2270    #[serde(default, skip_serializing_if = "Option::is_none")]
2271    pub topics: Option<Vec<Topic>>,
2272}
2273
2274#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2275#[non_exhaustive]
2276pub struct TopicPublication {
2277    #[serde(
2278        default,
2279        deserialize_with = "crate::types::null_as_default::deserialize"
2280    )]
2281    pub published: bool,
2282    /// The public link, when published
2283    #[serde(default, skip_serializing_if = "Option::is_none")]
2284    pub url: Option<String>,
2285}
2286
2287/// The tracked-time index: a page of completed tracks, and every category they can be
2288/// filed under.
2289#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2290#[non_exhaustive]
2291pub struct TrackedTime {
2292    #[serde(default, skip_serializing_if = "Option::is_none")]
2293    pub time_tracks: Option<Vec<Recording>>,
2294    #[serde(default, skip_serializing_if = "Option::is_none")]
2295    pub categories: Option<Vec<TimeTrackCategory>>,
2296}
2297
2298#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2299pub struct TrashPostingsRequestContent {
2300    #[serde(
2301        default,
2302        deserialize_with = "crate::types::null_as_default::deserialize"
2303    )]
2304    pub posting_ids: Vec<i64>,
2305    /// Omitted, JSON requests default to removing only your own access from shared topics.
2306    /// "false" trashes them for everyone instead.
2307    #[serde(default, skip_serializing_if = "Option::is_none")]
2308    pub remove_access: Option<String>,
2309}
2310
2311#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2312#[non_exhaustive]
2313pub struct UnauthorizedErrorResponseContent {
2314    #[serde(
2315        default,
2316        deserialize_with = "crate::types::null_as_default::deserialize"
2317    )]
2318    pub message: String,
2319}
2320
2321pub type UncompleteCalendarTodoResponseContent = Recording;
2322
2323pub type UncompleteHabitResponseContent = Recording;
2324
2325/// The server rejected what was sent. HEY answers {"errors": ["..."]} — the messages
2326/// the model itself produced — so a client can show them as they are.
2327#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2328#[non_exhaustive]
2329pub struct UnprocessableEntityErrorResponseContent {
2330    #[serde(default, skip_serializing_if = "Option::is_none")]
2331    pub errors: Option<Vec<String>>,
2332    #[serde(default, skip_serializing_if = "Option::is_none")]
2333    pub message: Option<String>,
2334}
2335
2336/// Wire format: {calendar_todo: {title, starts_at, focused}}
2337#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2338pub struct UpdateCalendarTodoRequestContent {
2339    #[serde(default)]
2340    pub calendar_todo: CalendarTodoChanges,
2341}
2342
2343pub type UpdateCalendarTodoResponseContent = Recording;
2344
2345/// Wire format: {status: "approved"|"denied"} — top level, not nested under a clearance key.
2346#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2347pub struct UpdateClearanceRequestContent {
2348    #[serde(
2349        default,
2350        deserialize_with = "crate::types::null_as_default::deserialize"
2351    )]
2352    pub status: String,
2353    #[serde(default, skip_serializing_if = "Option::is_none")]
2354    pub designation_box_id: Option<i64>,
2355    #[serde(default, skip_serializing_if = "Option::is_none")]
2356    pub spam: Option<bool>,
2357    #[serde(default, skip_serializing_if = "Option::is_none")]
2358    pub mark_topics_as_seen: Option<bool>,
2359}
2360
2361pub type UpdateClearanceResponseContent = Clearance;
2362
2363/// Wire format: {collection: {name, summary}}
2364#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2365pub struct UpdateCollectionRequestContent {
2366    #[serde(default)]
2367    pub collection: CollectionPayload,
2368}
2369
2370/// Wire format: {status: "approved"|"denied"} — top level, not nested under a clearance key.
2371#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2372pub struct UpdateContactClearanceRequestContent {
2373    #[serde(
2374        default,
2375        deserialize_with = "crate::types::null_as_default::deserialize"
2376    )]
2377    pub status: String,
2378}
2379
2380pub type UpdateContactNoteResponseContent = ContactNote;
2381
2382pub type UpdateContactResponseContent = Contact;
2383
2384/// Wire format: {identity_preference: {first_week_day: "monday"}}
2385#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2386pub struct UpdateFirstWeekDayRequestContent {
2387    #[serde(default)]
2388    pub identity_preference: FirstWeekDayParams,
2389}
2390
2391pub type UpdateFirstWeekDayResponseContent = FirstWeekDayPreference;
2392
2393pub type UpdateHabitResponseContent = Recording;
2394
2395/// Wire format: {calendar_journal_entry: {content}}
2396#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2397pub struct UpdateJournalEntryRequestContent {
2398    #[serde(default)]
2399    pub calendar_journal_entry: JournalEntryPayload,
2400}
2401
2402pub type UpdateJournalEntryResponseContent = Recording;
2403
2404#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2405pub struct UpdateMyClearanceRequestContent {
2406    #[serde(
2407        default,
2408        deserialize_with = "crate::types::null_as_default::deserialize"
2409    )]
2410    pub status: String,
2411}
2412
2413pub type UpdateMyClearanceResponseContent = Clearance;
2414
2415pub type UpdateStickyResponseContent = Sticky;
2416
2417#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2418pub struct UpdateTimeFormatRequestContent {
2419    #[serde(
2420        default,
2421        deserialize_with = "crate::types::null_as_default::deserialize"
2422    )]
2423    pub twenty_four_hour_time_format: bool,
2424}
2425
2426pub type UpdateTimeFormatResponseContent = TimeFormatPreference;
2427
2428#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2429pub struct UpdateTimeTrackPayload {
2430    /// Ignored by the server. A time track's title is the constant "Time Track";
2431    /// HEY dropped per-track titles in 2023. Kept for compatibility only.
2432    #[serde(default, skip_serializing_if = "Option::is_none")]
2433    pub title: Option<String>,
2434    #[serde(default, skip_serializing_if = "Option::is_none")]
2435    pub notes: Option<String>,
2436    /// Ignored by the server, which reads category_title instead. Kept for
2437    /// compatibility only.
2438    #[serde(default, skip_serializing_if = "Option::is_none")]
2439    pub category: Option<String>,
2440    /// Files the track under this category, creating the category if HEY does not
2441    /// have one by that name. Blank is a no-op, not a way to clear the category:
2442    /// once filed, a track can only be moved to another category, or left where it
2443    /// is by deleting the category itself.
2444    #[serde(default, skip_serializing_if = "Option::is_none")]
2445    pub category_title: Option<String>,
2446    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2447    #[serde(default, skip_serializing_if = "Option::is_none")]
2448    pub starts_at: Option<DateTime>,
2449    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2450    #[serde(default, skip_serializing_if = "Option::is_none")]
2451    pub ends_at: Option<DateTime>,
2452}
2453
2454/// Wire format: {calendar_time_track: {notes, category_title, starts_at, ends_at}}
2455#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2456pub struct UpdateTimeTrackRequestContent {
2457    #[serde(default)]
2458    pub calendar_time_track: UpdateTimeTrackPayload,
2459}
2460
2461pub type UpdateTimeTrackResponseContent = Recording;
2462
2463/// UpdatesChannel — streaming channel for a box
2464#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2465#[non_exhaustive]
2466pub struct UpdatesChannel {
2467    #[serde(default, skip_serializing_if = "Option::is_none")]
2468    pub signed_stream_name: Option<String>,
2469}
2470
2471/// User — a user within an account
2472#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2473#[non_exhaustive]
2474pub struct User {
2475    #[serde(
2476        default,
2477        deserialize_with = "crate::types::null_as_default::deserialize"
2478    )]
2479    pub id: i64,
2480    #[serde(default, skip_serializing_if = "Option::is_none")]
2481    pub account_id: Option<i64>,
2482    #[serde(default, skip_serializing_if = "Option::is_none")]
2483    pub account_purpose_icon_url: Option<String>,
2484    #[serde(default, skip_serializing_if = "Option::is_none")]
2485    pub contact: Option<Contact>,
2486    #[serde(default, skip_serializing_if = "Option::is_none")]
2487    pub external_accounts: Option<Vec<ExternalAccount>>,
2488    #[serde(default, skip_serializing_if = "Option::is_none")]
2489    pub auto_responder: Option<bool>,
2490}
2491
2492/// Workflow — email workflow/label
2493#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2494#[non_exhaustive]
2495pub struct Workflow {
2496    #[serde(
2497        default,
2498        deserialize_with = "crate::types::null_as_default::deserialize"
2499    )]
2500    pub id: i64,
2501    #[serde(default, skip_serializing_if = "Option::is_none")]
2502    pub name: Option<String>,
2503    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2504    #[serde(default, skip_serializing_if = "Option::is_none")]
2505    pub created_at: Option<DateTime>,
2506    /// ISO 8601 date-time timestamp (overrides restJson1 epoch-seconds default)
2507    #[serde(default, skip_serializing_if = "Option::is_none")]
2508    pub updated_at: Option<DateTime>,
2509    #[serde(default, skip_serializing_if = "Option::is_none")]
2510    pub app_url: Option<String>,
2511    /// The workflow's stages in position order. Present on GetWorkflow.
2512    #[serde(default, skip_serializing_if = "Option::is_none")]
2513    pub stages: Option<Vec<WorkflowStage>>,
2514}
2515
2516#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2517#[non_exhaustive]
2518pub struct WorkflowStage {
2519    #[serde(
2520        default,
2521        deserialize_with = "crate::types::null_as_default::deserialize"
2522    )]
2523    pub id: i64,
2524    #[serde(default, skip_serializing_if = "Option::is_none")]
2525    pub name: Option<String>,
2526}
2527
2528#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
2529pub struct WorkflowStagingPayload {
2530    #[serde(
2531        default,
2532        deserialize_with = "crate::types::null_as_default::deserialize"
2533    )]
2534    pub workflow_stage_id: i64,
2535}