GitSpacer / GitSpace

🌌 GitSpace
MIT License
7 stars 0 forks source link

#17/feat network client abstracted object impl #18

Closed ValseLee closed 8 months ago

ValseLee commented 8 months ago

개요


✏️ 작업 사항

/*--------------------*/
/*---protocol Layer---*/
/*--------------------*/
private protocol GSApiTransferable<T> {
  associatedtype T: Codable
  var create: () async throws -> T? { get set }
  var read: () async throws -> T? { get set }
  var delete: () async throws -> T? { get set }
  var update: () async throws -> T? { get set }
}

public struct GSFirebaseClient<T: Codable>: GSApiTransferable {
  public var create: () async throws -> T?
  public var read: () async throws -> T?
  public var delete: () async throws -> T?
  public var update: () async throws -> T?

  public init(
    create: @escaping () -> T? = { return nil },
    read: @escaping () -> T? = { return nil },
    delete: @escaping () -> T? = { return nil },
    update: @escaping () -> T? = { return nil }
  ) {
    self.create = create
    self.read = read
    self.delete = delete
    self.update = update
  }
}

// MARK: Additional Helpers
extension GSFirebaseClient {
  // 요런 식으로 Client를 확장하여 필요한 로직을 추가 제공
  public func fetchAll() -> [T] {
    return []
  }
}

/*-----------------*/
/*---Model Layer---*/
/*-----------------*/
struct ModelSample: Codable { }
struct GitHubModel: Codable { }
struct FirebaseModel: Codable { }

/*----------------*/
/*---View Layer---*/
/*----------------*/
private struct MyView: View {
  let firebaseClient: some GSApiTransferable = GSFirebaseClient(
      create: { return ModelSample() },
      read: { return ModelSample() }
  )

  let githubClient: some GSApiTransferable = GSGitHubClient<GitHubModel>()

  var body: some View {
      VStack { }
  }
}
wontaeyoung commented 8 months ago

좋은 추상화 시도인 것 같습니다! 예전에 보여주셨던 live와 test 객체를 생성 시점에 결정하는 것과도 유사하네요. 고생하셨습니다!!!