/*
 * Copyright (c) 2015-2021, Antonio Gabriel Muñoz Conejo <antoniogmc at gmail dot com>
 * Distributed under the terms of the MIT License
 */
package com.github.tonivade.resp.command;

import static com.github.tonivade.purefun.Precondition.checkNonNull;
import static com.github.tonivade.resp.protocol.RedisToken.error;

import com.github.tonivade.resp.annotation.ParamLength;
import com.github.tonivade.resp.protocol.RedisToken;

public class CommandWrapper implements RespCommand {

  private int params;

  private int optionParams;

  private final RespCommand command;

  public CommandWrapper(RespCommand command) {
    this.command = checkNonNull(command);
    ParamLength length = command.getClass().getAnnotation(ParamLength.class);
    if (length != null) {
      this.params = length.value();
      this.optionParams = length.value() + length.option();
    }
  }

  @Override
  public RedisToken execute(Request request) {
    if (request.getLength() < params || request.getLength() > optionParams) {
      return error("ERR wrong number of arguments for '" + request.getCommand() + "' command");
    }
    return command.execute(request);
  }
}

@@ -490,19 +490,23 @@
 private 
-i
+I
 nt
+eger
  params;
@@ -521,11 +521,15 @@
 ate 
-i
+I
 nt
+eger
  opt
@@ -933,24 +933,76 @@
  request) %7B%0A
+    if (params != null && optionParams != null) %7B%0A  
     if (requ
@@ -1063,24 +1063,26 @@
 onParams) %7B%0A
+  
       return
@@ -1165,16 +1165,24 @@
 mand%22);%0A
+      %7D%0A
     %7D%0A  

use wrap class to check @ParamLength is config.