From 94fb94bf94e3adb0a095ed81580e228f6888eaee Mon Sep 17 00:00:00 2001 From: Andreas Thomas Date: Sat, 7 Jan 2023 17:15:17 +0100 Subject: [PATCH] feat: smismember --- pkg/commands/mod.ts | 1 + pkg/commands/smismember.test.ts | 25 +++++++++++++++++++++++++ pkg/commands/smismember.ts | 15 +++++++++++++++ pkg/pipeline.ts | 9 +++++++++ pkg/redis.ts | 9 +++++++++ 5 files changed, 59 insertions(+) create mode 100644 pkg/commands/smismember.test.ts create mode 100644 pkg/commands/smismember.ts diff --git a/pkg/commands/mod.ts b/pkg/commands/mod.ts index 44c1410d..6c2ea14e 100644 --- a/pkg/commands/mod.ts +++ b/pkg/commands/mod.ts @@ -23,6 +23,7 @@ export * from "./getset.ts"; export * from "./hdel.ts"; export * from "./hexists.ts"; export * from "./hget.ts"; +export * from "./smismember.ts"; export * from "./hgetall.ts"; export * from "./hincrby.ts"; export * from "./hincrbyfloat.ts"; diff --git a/pkg/commands/smismember.test.ts b/pkg/commands/smismember.test.ts new file mode 100644 index 00000000..42693734 --- /dev/null +++ b/pkg/commands/smismember.test.ts @@ -0,0 +1,25 @@ +import { keygen, newHttpClient, randomID } from "../test-utils.ts"; + +import { SAddCommand } from "./sadd.ts"; +import { SMIsMemberCommand } from "./smismember.ts"; +import { assertEquals } from "https://deno.land/std@0.152.0/testing/asserts.ts"; + +import { afterAll } from "https://deno.land/std@0.152.0/testing/bdd.ts"; +const client = newHttpClient(); + +const { newKey, cleanup } = keygen(); +afterAll(cleanup); + +Deno.test("when member exists", async (t) => { + await t.step("returns 1", async () => { + const key = newKey(); + const value1 = randomID(); + const value2 = randomID(); + await new SAddCommand([key, value1]).exec(client); + await new SAddCommand([key, value2]).exec(client); + const res = await new SMIsMemberCommand([key, value1, randomID()]).exec( + client, + ); + assertEquals(res, [1, 0]); + }); +}); diff --git a/pkg/commands/smismember.ts b/pkg/commands/smismember.ts new file mode 100644 index 00000000..c9d9d313 --- /dev/null +++ b/pkg/commands/smismember.ts @@ -0,0 +1,15 @@ +import { Command, CommandOptions } from "./command.ts"; +/** + * @see https://redis.io/commands/smismember + */ +export class SMIsMemberCommand extends Command< + ("0" | "1")[], + (0 | 1)[] +> { + constructor( + cmd: [key: string, ...members: TMembers], + opts?: CommandOptions<("0" | "1")[], (0 | 1)[]>, + ) { + super(["smismember", ...cmd], opts); + } +} diff --git a/pkg/pipeline.ts b/pkg/pipeline.ts index be370ca7..0f7c736e 100644 --- a/pkg/pipeline.ts +++ b/pkg/pipeline.ts @@ -86,6 +86,7 @@ import { SInterStoreCommand, SIsMemberCommand, SMembersCommand, + SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, @@ -796,6 +797,14 @@ export class Pipeline { ...args: CommandArgs ) => this.chain(new SMembersCommand(args, this.commandOptions)); + /** + * @see https://redis.io/commands/smismember + */ + smismember = (key: string, members: TMembers) => + this.chain( + new SMIsMemberCommand([key, members], this.commandOptions), + ); + /** * @see https://redis.io/commands/smove */ diff --git a/pkg/redis.ts b/pkg/redis.ts index 6b485c32..450751f0 100644 --- a/pkg/redis.ts +++ b/pkg/redis.ts @@ -88,6 +88,7 @@ import { SInterStoreCommand, SIsMemberCommand, SMembersCommand, + SMIsMemberCommand, SMoveCommand, SPopCommand, SRandMemberCommand, @@ -755,6 +756,14 @@ export class Redis { sismember = (key: string, member: TData) => new SIsMemberCommand([key, member], this.opts).exec(this.client); + /** + * @see https://redis.io/commands/smismember + */ + smismember = (key: string, members: TMembers) => + new SMIsMemberCommand([key, members], this.opts).exec( + this.client, + ); + /** * @see https://redis.io/commands/smembers */