/* * Copyright (c) 2021, Kyle Pereira * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace IMAP { class Client; struct ParseStatus { bool successful; Optional response; }; class Parser { public: ParseStatus parse(ByteBuffer&& buffer, bool expecting_tag); private: static MailboxFlag parse_mailbox_flag(StringView); ErrorOr try_parse(ByteBuffer&& buffer, bool expecting_tag); ErrorOr consume(StringView); bool consume_if(StringView); StringView consume_while(Function should_consume); StringView consume_until_end_of_line(); bool at_end() { return m_position >= m_buffer.size(); } ErrorOr parse_number(); Optional try_parse_number(); ErrorOr parse_response_done(); ErrorOr parse_untagged(); ErrorOr parse_capability_response(); ErrorOr parse_atom(); ErrorOr parse_quoted_string(); ErrorOr parse_literal_string(); ErrorOr parse_string(); ErrorOr parse_astring(); ErrorOr parse_nstring(); ErrorOr parse_status(); ErrorOr parse_list_item(); ErrorOr parse_fetch_data_item(); ErrorOr parse_fetch_response(); ErrorOr> parse_address_list(); ErrorOr
parse_address(); ErrorOr> parse_body_fields_params(); ErrorOr parse_body_structure(); ErrorOr parse_one_part_body(); ErrorOr parse_body_extension(); ErrorOr>> parse_disposition(); ErrorOr> parse_langs(); ErrorOr parse_envelope(); template ErrorOr> parse_list(T (*converter)(StringView)); // To retain state if parsing is not finished ByteBuffer m_buffer; SolidResponse m_response; unsigned m_position { 0 }; bool m_incomplete { false }; }; }