FileStorage.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import Combine
  2. import Disk
  3. import Foundation
  4. protocol FileStorage {
  5. func save<Value: JSON>(_: Value, as name: String) -> AnyPublisher<Void, Error>
  6. func retrieve<Value: JSON>(_: String, as type: Value.Type) -> AnyPublisher<Value, Error>
  7. func append<Value: JSON>(_: Value, to name: String) -> AnyPublisher<Void, Error>
  8. }
  9. final class BaseFileStorage: FileStorage {
  10. private let processQueue = DispatchQueue(label: "BaseFileStorage.processQueue")
  11. func save<Value: JSON>(_ value: Value, as name: String) -> AnyPublisher<Void, Error> {
  12. Future { promise in
  13. self.processQueue.async {
  14. do {
  15. let encoder = JSONEncoder()
  16. encoder.outputFormatting = .prettyPrinted
  17. try Disk.save(value, to: .documents, as: name, encoder: encoder)
  18. promise(.success(()))
  19. } catch {
  20. promise(.failure(error))
  21. }
  22. }
  23. }
  24. .eraseToAnyPublisher()
  25. }
  26. func retrieve<Value: JSON>(_ name: String, as type: Value.Type) -> AnyPublisher<Value, Error> {
  27. Future { promise in
  28. self.processQueue.async {
  29. do {
  30. let value = try Disk.retrieve(name, from: .documents, as: type)
  31. promise(.success(value))
  32. } catch {
  33. promise(.failure(error))
  34. }
  35. }
  36. }
  37. .eraseToAnyPublisher()
  38. }
  39. func append<Value: JSON>(_ newValue: Value, to name: String) -> AnyPublisher<Void, Error> {
  40. Future { promise in
  41. self.processQueue.async {
  42. do {
  43. try Disk.append(newValue, to: name, in: .documents)
  44. promise(.success(()))
  45. } catch {
  46. promise(.failure(error))
  47. }
  48. }
  49. }
  50. .eraseToAnyPublisher()
  51. }
  52. }