Redis client behaviour, there are 2 implementations of this behaviour:
@opaque command_t()
@type resp_t() :: {:ok, term()} | LibRedis.Error.t()
@type t() :: struct()
@callback command(t(), command_t(), keyword()) :: resp_t()
@callback new(keyword()) :: t()
@callback pipeline(t(), [command_t()], keyword()) :: resp_t()
@callback start_link(keyword()) :: LibRedis.Typespecs.on_start()
@spec command(t(), command_t(), keyword()) :: resp_t()
@spec pipeline(t(), [command_t()], keyword()) :: resp_t()