2
0

command.zig 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. const std = @import("std");
  2. const storage = @import("storage.zig");
  3. const index = @import("index.zig");
  4. const FAILURE_RESPONSE = "error";
  5. const SUCCESS_RESPONSE = "success";
  6. const Command = enum {
  7. read,
  8. write,
  9. delete,
  10. status,
  11. keys,
  12. reads,
  13. };
  14. fn parseKeyValue(buf: []const u8) ?[2][]const u8 {
  15. var kvIterator = std.mem.splitAny(u8, buf, "|");
  16. const key = kvIterator.first();
  17. return [2][]const u8{ key, kvIterator.rest() };
  18. }
  19. pub fn parse(msg: []const u8, allocator: std.mem.Allocator) ?[]const u8 {
  20. const trimSet = [_]u8{ '\n', ' ', '\r' };
  21. const cleanMsg = std.mem.trim(u8, msg, &trimSet);
  22. var messageIterator = std.mem.splitAny(u8, cleanMsg, " ");
  23. const cmdString = messageIterator.first();
  24. const cmd = std.meta.stringToEnum(Command, cmdString) orelse {
  25. return null;
  26. };
  27. switch (cmd) {
  28. .read => {
  29. const key = messageIterator.rest();
  30. const value = storage.read(key) orelse {
  31. return FAILURE_RESPONSE;
  32. };
  33. return value;
  34. },
  35. .write => {
  36. const kvPair = messageIterator.rest();
  37. const kv = parseKeyValue(kvPair) orelse {
  38. return FAILURE_RESPONSE;
  39. };
  40. if (storage.write(kv[0], kv[1])) {
  41. return SUCCESS_RESPONSE;
  42. }
  43. return FAILURE_RESPONSE;
  44. },
  45. .delete => {
  46. const key = messageIterator.rest();
  47. if (!storage.delete(key)) {
  48. return FAILURE_RESPONSE;
  49. }
  50. return SUCCESS_RESPONSE;
  51. },
  52. .keys => {
  53. return index.getAllKeys(allocator);
  54. },
  55. .reads => {
  56. const prefix = messageIterator.rest();
  57. return index.getValuesByPrefix(prefix, allocator);
  58. },
  59. .status => {
  60. return "well going our operation";
  61. },
  62. }
  63. return null;
  64. }