mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:07:35 +00:00
LibIMAP: Simplify parsing one part body structure
Each branch was very similar, so let's merge common parts together for clarity. Also added corresponding ABNF rules names while I'm here. :^) No behavior change.
This commit is contained in:
parent
2eb9f3f639
commit
a61a66c685
1 changed files with 33 additions and 80 deletions
|
@ -423,37 +423,35 @@ BodyStructure Parser::parse_body_structure()
|
||||||
return parse_one_part_body();
|
return parse_one_part_body();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// body-type-1part
|
||||||
BodyStructure Parser::parse_one_part_body()
|
BodyStructure Parser::parse_one_part_body()
|
||||||
{
|
{
|
||||||
auto type = parse_string();
|
// NOTE: We share common parts between body-type-basic, body-type-msg and body-type-text types for readability.
|
||||||
consume(" "sv);
|
BodyStructureData data;
|
||||||
auto subtype = parse_string();
|
|
||||||
consume(" "sv);
|
|
||||||
if (type.equals_ignoring_ascii_case("TEXT"sv)) {
|
|
||||||
// body-type-text
|
|
||||||
auto params = parse_body_fields_params();
|
|
||||||
consume(" "sv);
|
|
||||||
auto id = parse_nstring();
|
|
||||||
consume(" "sv);
|
|
||||||
auto description = parse_nstring();
|
|
||||||
consume(" "sv);
|
|
||||||
auto encoding = parse_string();
|
|
||||||
consume(" "sv);
|
|
||||||
auto num_octets = MUST(parse_number());
|
|
||||||
consume(" "sv);
|
|
||||||
auto num_lines = MUST(parse_number());
|
|
||||||
|
|
||||||
auto data = BodyStructureData {
|
// media-basic / media-message / media-text
|
||||||
type,
|
data.type = parse_string();
|
||||||
subtype,
|
consume(" "sv);
|
||||||
Optional<DeprecatedString>(move(id)),
|
data.subtype = parse_string();
|
||||||
Optional<DeprecatedString>(move(description)),
|
consume(" "sv);
|
||||||
encoding,
|
|
||||||
params,
|
// body-fields
|
||||||
num_octets,
|
data.fields = parse_body_fields_params();
|
||||||
num_lines,
|
consume(" "sv);
|
||||||
{}
|
data.id = Optional<DeprecatedString>(parse_nstring());
|
||||||
};
|
consume(" "sv);
|
||||||
|
data.desc = Optional<DeprecatedString>(parse_nstring());
|
||||||
|
consume(" "sv);
|
||||||
|
data.encoding = parse_string();
|
||||||
|
consume(" "sv);
|
||||||
|
data.bytes = MUST(parse_number());
|
||||||
|
|
||||||
|
if (data.type.equals_ignoring_ascii_case("TEXT"sv)) {
|
||||||
|
// body-type-text
|
||||||
|
// NOTE: "media-text SP body-fields" part is already parsed.
|
||||||
|
consume(" "sv);
|
||||||
|
data.lines = MUST(parse_number());
|
||||||
|
|
||||||
if (!try_consume(")"sv)) {
|
if (!try_consume(")"sv)) {
|
||||||
consume(" "sv);
|
consume(" "sv);
|
||||||
|
@ -489,62 +487,17 @@ BodyStructure Parser::parse_one_part_body()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (data.type.equals_ignoring_ascii_case("MESSAGE"sv) && data.subtype.equals_ignoring_ascii_case("RFC822"sv)) {
|
||||||
return BodyStructure(move(data));
|
// body-type-msg
|
||||||
} else if (type.equals_ignoring_ascii_case("MESSAGE"sv) && subtype.equals_ignoring_ascii_case("RFC822"sv)) {
|
// NOTE: "media-message SP body-fields" part is already parsed.
|
||||||
// body-type-message
|
|
||||||
auto params = parse_body_fields_params();
|
|
||||||
consume(" "sv);
|
consume(" "sv);
|
||||||
auto id = parse_nstring();
|
data.envelope = parse_envelope();
|
||||||
consume(" "sv);
|
|
||||||
auto description = parse_nstring();
|
|
||||||
consume(" "sv);
|
|
||||||
auto encoding = parse_string();
|
|
||||||
consume(" "sv);
|
|
||||||
auto num_octets = MUST(parse_number());
|
|
||||||
consume(" "sv);
|
|
||||||
auto envelope = parse_envelope();
|
|
||||||
|
|
||||||
BodyStructureData data {
|
|
||||||
type,
|
|
||||||
subtype,
|
|
||||||
Optional<DeprecatedString>(move(id)),
|
|
||||||
Optional<DeprecatedString>(move(description)),
|
|
||||||
encoding,
|
|
||||||
params,
|
|
||||||
num_octets,
|
|
||||||
0,
|
|
||||||
envelope
|
|
||||||
};
|
|
||||||
|
|
||||||
return BodyStructure(move(data));
|
|
||||||
} else {
|
} else {
|
||||||
// body-type-basic
|
// body-type-basic
|
||||||
auto params = parse_body_fields_params();
|
// NOTE: "media-basic SP body-fields" is already parsed.
|
||||||
consume(" "sv);
|
|
||||||
auto id = parse_nstring();
|
|
||||||
consume(" "sv);
|
|
||||||
auto description = parse_nstring();
|
|
||||||
consume(" "sv);
|
|
||||||
auto encoding = parse_string();
|
|
||||||
consume(" "sv);
|
|
||||||
auto num_octets = MUST(parse_number());
|
|
||||||
consume(" "sv);
|
|
||||||
|
|
||||||
BodyStructureData data {
|
|
||||||
type,
|
|
||||||
subtype,
|
|
||||||
Optional<DeprecatedString>(move(id)),
|
|
||||||
Optional<DeprecatedString>(move(description)),
|
|
||||||
encoding,
|
|
||||||
params,
|
|
||||||
num_octets,
|
|
||||||
0,
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
||||||
return BodyStructure(move(data));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return BodyStructure(move(data));
|
||||||
}
|
}
|
||||||
Vector<DeprecatedString> Parser::parse_langs()
|
Vector<DeprecatedString> Parser::parse_langs()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue