command.zig 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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) ?[]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 command = std.meta.stringToEnum(Command, cmdString) orelse {
  25. std.debug.print("Failed to parse command: {s}\n", .{cmdString});
  26. return null;
  27. };
  28. switch (command) {
  29. .read => {
  30. const key = messageIterator.rest();
  31. const value = storage.read(key) orelse {
  32. std.debug.print("Key not found in storage: {s}\n", .{key});
  33. return FAILURE_RESPONSE;
  34. };
  35. return value;
  36. },
  37. .write => {
  38. const kvPair = messageIterator.rest();
  39. const kv = parseKeyValue(kvPair) orelse {
  40. std.debug.print("Failed to parse key-value pair", .{});
  41. return FAILURE_RESPONSE;
  42. };
  43. if (storage.write(kv[0], kv[1])) {
  44. return SUCCESS_RESPONSE;
  45. }
  46. std.debug.print("Failed to write to storage", .{});
  47. return FAILURE_RESPONSE;
  48. },
  49. .delete => {
  50. const key = messageIterator.rest();
  51. if (!storage.delete(key)) {
  52. std.debug.print("Failed to delete key from storage: {s}\n", .{key});
  53. return FAILURE_RESPONSE;
  54. }
  55. return SUCCESS_RESPONSE;
  56. },
  57. .keys => {
  58. return index.getAllKeys();
  59. },
  60. .reads => {
  61. const prefix = messageIterator.rest();
  62. return index.getValuesByPrefix(prefix);
  63. },
  64. .status => {
  65. return "well going our operation";
  66. },
  67. }
  68. return null;
  69. }