import Foundation

public struct RestlikeMessage: Equatable {
  public init(
    version: Int,
    headers: Data,
    content: Data,
    method: Int,
    uri: String,
    error: String
  ) {
    self.version = version
    self.headers = headers
    self.content = content
    self.method = method
    self.uri = uri
    self.error = error
  }

  public var version: Int?
  public var headers: Data?
  public var content: Data?
  public var method: Int?
  public var uri: String?
  public var error: String?
}

extension RestlikeMessage: Codable {
  enum CodingKeys: String, CodingKey {
    case version = "Version"
    case headers = "Headers"
    case content = "Content"
    case method = "Method"
    case uri = "URI"
    case error = "Error"
  }

  public init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    version = try container.decodeIfPresent(Int.self, forKey: .version)
    headers = try container.decodeIfPresent(Data.self, forKey: .headers)
    content = try container.decodeIfPresent(Data.self, forKey: .content)
    method = try container.decodeIfPresent(Int.self, forKey: .method)
    uri = try container.decodeIfPresent(String.self, forKey: .uri)
    error = try container.decodeIfPresent(String.self, forKey: .error)
  }
}