1use std::ops::RangeInclusive;
3
4use chrono::{DateTime, Utc};
5use md5::Digest;
6
7use serde::{Deserialize, Serialize};
8use serde_with::serde_as;
9
10use crate::{jfs::RevisionState, path::PathOnDevice};
11
12#[serde_as]
14#[derive(Debug, Serialize)]
15pub struct AllocReq<'a> {
16 pub path: &'a PathOnDevice,
18
19 pub bytes: u64,
21
22 #[serde(with = "crate::serde::md5_hex")]
24 pub md5: md5::Digest,
25
26 pub conflict_handler: ConflictHandler,
28
29 #[serde_as(as = "Option<serde_with::TimestampMilliSeconds<i64>>")]
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub created: Option<DateTime<Utc>>,
33
34 #[serde_as(as = "Option<serde_with::TimestampMilliSeconds<i64>>")]
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub modified: Option<DateTime<Utc>>,
38}
39
40#[derive(Debug, Serialize, Deserialize)]
42#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
43pub enum ConflictHandler {
44 RejectConflicts,
46 CreateNewRevision,
48}
49
50#[derive(Debug, Deserialize)]
52pub struct AllocRes {
53 pub name: String,
55
56 pub path: PathOnDevice,
58
59 pub state: RevisionState,
61
62 pub upload_id: String,
64
65 pub upload_url: String,
67
68 pub bytes: u64,
70
71 pub resume_pos: u64,
73}
74
75#[serde_as]
77#[derive(Debug, Deserialize)]
78pub struct CompleteUploadRes {
79 #[serde(with = "crate::serde::md5_hex")]
83 pub md5: Digest,
84
85 pub bytes: u64,
87
88 pub content_id: String,
90
91 pub path: PathOnDevice,
93
94 #[serde_as(as = "serde_with::TimestampMilliSeconds<i64>")]
96 pub modified: DateTime<Utc>,
97}
98
99#[derive(Debug)]
102pub struct IncompleteUploadRes {
103 pub range: RangeInclusive<u64>,
105}
106
107#[derive(Debug)]
109pub enum UploadRes {
110 Complete(CompleteUploadRes),
112 Incomplete(IncompleteUploadRes),
114}