import Foundation

public struct MessageService: Equatable {
  public init(
    identifier: Data,
    tag: String,
    metadata: Data
  ) {
    self.identifier = identifier
    self.tag = tag
    self.metadata = metadata
  }

  public var identifier: Data
  public var tag: String
  public var metadata: Data
}

extension MessageService: Codable {
  enum CodingKeys: String, CodingKey {
    case identifier = "Identifier"
    case tag = "Tag"
    case metadata = "Metadata"
  }

  public static func decode(_ data: Data) throws -> Self {
    try JSONDecoder().decode(Self.self, from: data)
  }

  public func encode() throws -> Data {
    try JSONEncoder().encode(self)
  }
}

extension Array where Element == MessageService {
  public static func decode(_ data: Data) throws -> Self {
    try JSONDecoder().decode(Self.self, from: data)
  }

  public func encode() throws -> Data {
    try JSONEncoder().encode(self)
  }
}