Parser.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*
  2. * Copyright (c) 2021, Kyle Pereira <hey@xylepereira.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/Result.h>
  9. #include <LibIMAP/Objects.h>
  10. namespace IMAP {
  11. class Client;
  12. struct ParseStatus {
  13. bool successful;
  14. Optional<Response> response;
  15. };
  16. class Parser {
  17. public:
  18. ParseStatus parse(ByteBuffer&& buffer, bool expecting_tag);
  19. private:
  20. // To retain state if parsing is not finished
  21. ByteBuffer m_buffer;
  22. SolidResponse m_response;
  23. unsigned position { 0 };
  24. bool m_incomplete { false };
  25. bool m_parsing_failed { false };
  26. bool try_consume(StringView);
  27. bool at_end() { return position >= m_buffer.size(); };
  28. void parse_response_done();
  29. void consume(StringView x);
  30. unsigned parse_number();
  31. Optional<unsigned> try_parse_number();
  32. void parse_untagged();
  33. StringView parse_atom();
  34. StringView parse_quoted_string();
  35. StringView parse_string();
  36. Optional<StringView> parse_nstring();
  37. ResponseStatus parse_status();
  38. template<typename T>
  39. Vector<T> parse_list(T (*converter)(StringView));
  40. static MailboxFlag parse_mailbox_flag(StringView s);
  41. StringView parse_while(Function<bool(u8)> should_consume);
  42. void parse_capability_response();
  43. ListItem parse_list_item();
  44. FetchCommand::DataItem parse_fetch_data_item();
  45. FetchResponseData parse_fetch_response();
  46. StringView parse_literal_string();
  47. Optional<Vector<Address>> parse_address_list();
  48. Address parse_address();
  49. StringView parse_astring();
  50. HashMap<String, String> parse_body_fields_params();
  51. BodyStructure parse_body_structure();
  52. BodyStructure parse_one_part_body();
  53. Tuple<String, HashMap<String, String>> parse_disposition();
  54. Vector<String> parse_langs();
  55. BodyExtension parse_body_extension();
  56. Envelope parse_envelope();
  57. };
  58. }