1 // Copyright 2023-present 650 Industries. All rights reserved.
2 
3 import ExpoModulesCore
4 
5 struct InfoOptions: Record {
6   @Field var md5: Bool = false
7   @Field var size: Bool = false
8 }
9 
10 struct ReadingOptions: Record {
11   @Field var encoding: Encoding = .utf8
12   @Field var position: Int?
13   @Field var length: Int?
14 }
15 
16 struct WritingOptions: Record {
17   @Field var encoding: Encoding = .utf8
18 }
19 
20 struct DeletingOptions: Record {
21   @Field var idempotent: Bool = false
22 }
23 
24 struct RelocatingOptions: Record {
25   @Field var from: URL?
26   @Field var to: URL?
27 
asTuplenull28   func asTuple() throws -> (URL, URL) {
29     guard let from, let to else {
30       let missingOptionName = from == nil ? "from" : "to"
31       throw Exception(name: "MissingParameterException", description: "Missing option '\(missingOptionName)'")
32     }
33     return (from, to)
34   }
35 }
36 
37 struct MakeDirectoryOptions: Record {
38   @Field var intermediates: Bool = false
39 }
40 
41 struct DownloadOptions: Record {
42   @Field var md5: Bool = false
43   @Field var cache: Bool = false
44   @Field var headers: [String: String]?
45   @Field var sessionType: SessionType = .background
46 }
47 
48 struct UploadOptions: Record {
49   @Field var headers: [String: String]?
50   @Field var httpMethod: HttpMethod = .post
51   @Field var sessionType: SessionType = .background
52   @Field var uploadType: UploadType = .binaryContent
53 
54   // Multipart
55   @Field var fieldName: String?
56   @Field var mimeType: String?
57   @Field var parameters: [String: String]?
58 }
59 
60 enum SessionType: Int, Enumerable {
61   case background = 0
62   case foreground = 1
63 }
64 
65 enum HttpMethod: String, Enumerable {
66   case post = "POST"
67   case put = "PUT"
68   case patch = "PATCH"
69 }
70 
71 enum UploadType: Int, Enumerable {
72   case binaryContent = 0
73   case multipart = 1
74 }
75