///|
/// Configuration for registering a RESTful resource with standard CRUD routes.
pub(all) struct ResourceConfig {
  /// GET /path — list all resources
  list : (async (MocketEvent) -> &Responder)?
  /// GET /path/:id — get a single resource by ID
  get : (async (MocketEvent) -> &Responder)?
  /// POST /path — create a new resource
  create : (async (MocketEvent) -> &Responder)?
  /// PUT /path/:id — update an existing resource
  update : (async (MocketEvent) -> &Responder)?
  /// DELETE /path/:id — delete a resource
  delete : (async (MocketEvent) -> &Responder)?

  fn new(
    list? : async (MocketEvent) -> &Responder,
    get? : async (MocketEvent) -> &Responder,
    create? : async (MocketEvent) -> &Responder,
    update? : async (MocketEvent) -> &Responder,
    delete? : async (MocketEvent) -> &Responder,
  ) -> ResourceConfig
}

///|
/// Creates a new `ResourceConfig` with optional CRUD handlers.
pub fn ResourceConfig::new(
  list? : async (MocketEvent) -> &Responder,
  get? : async (MocketEvent) -> &Responder,
  create? : async (MocketEvent) -> &Responder,
  update? : async (MocketEvent) -> &Responder,
  delete? : async (MocketEvent) -> &Responder,
) -> ResourceConfig {
  { list, get, create, update, delete }
}

///|
/// Registers standard REST routes (list, get, create, update, delete) for a resource path.
pub fn Mocket::resource(
  self : Mocket,
  path : String,
  config : ResourceConfig,
) -> Unit {
  match config.list {
    Some(handler) => self.get(path, handler)
    None => ()
  }
  match config.get {
    Some(handler) => self.get(path + "/:id", handler)
    None => ()
  }
  match config.create {
    Some(handler) => self.post(path, handler)
    None => ()
  }
  match config.update {
    Some(handler) => self.put(path + "/:id", handler)
    None => ()
  }
  match config.delete {
    Some(handler) => self.delete(path + "/:id", handler)
    None => ()
  }
}