All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.finch.petstore.orderStatus.scala Maven / Gradle / Ivy

The newest version!
package io.finch.petstore

import argonaut.{CodecJson, DecodeResult, DecodeJson, EncodeJson}

/**
 * Represents the status of a particular order for pets. Can be "placed," "approved," or "delivered."
 */
sealed trait OrderStatus {
  /**
   * @return The string representation of the OrderStatus.
   */
  def code: String
}

/**
 * The status of an order after it has been placed.
 */
case object Placed extends OrderStatus {
  /**
   * @return The string representation of the OrderStatus: "placed."
   */
  def code: String = "placed"
}

/**
 * The status of an order after it has been approved by the store.
 */
case object Approved extends OrderStatus {
  /**
   * @return The string representation of the OrderStatus: "approved."
   */
  def code: String = "approved"
}

/**
 * The status of an order after it has been delivered and completed.
 */
case object Delivered extends OrderStatus {
  /**
   * @return The string representation of the OrderStatus: "delivered."
   */
  def code: String = "delivered"
}

/**
 * Provides encode and decode methods for OrderStatus objects.
 * If asked to decode a string other than "placed," "approved," or "delivered" the
 * system will fail.
 */
object OrderStatus {
  /**
   * Coverts a given string into its corresponding OrderStatus object.
   * @return OrderStatus object corresponding to s.
   */
  def fromString(s: String): OrderStatus = s match {
    case "placed" => Placed
    case "approved" => Approved
    case "delivered" => Delivered
  }

  /**
   * Encodes a given OrderStatus into JSON.
   */
  val orderStatusEncode: EncodeJson[OrderStatus] =
    EncodeJson.jencode1[OrderStatus, String](_.code)

  /**
   * Decodes a given piece of JSON into an OrderStatus object.
   * If the given string does not match any of the three valid OrderStatuses,
   * the system will fail.
   */
  val orderStatusDecode: DecodeJson[OrderStatus] =
    DecodeJson { c =>
      c.as[String].flatMap[OrderStatus] {
        case "placed" => DecodeResult.ok(Placed)
        case "approved" => DecodeResult.ok(Approved)
        case "delivered" => DecodeResult.ok(Delivered)
        case other => DecodeResult.fail(s"Unknown status: $other", c.history)
      }
    }

  /**
   * Creates a codec for OrderStatus objects.
   */
  implicit val orderStatusCodec: CodecJson[OrderStatus] =
    CodecJson.derived(orderStatusEncode, orderStatusDecode)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy