parseNumeric

Parser for RPL_NAMREPLY

Format is 353 <client> =/*/@ <channel> :<prefix[es]><usermask>[ <prefix[es]><usermask>...]

Examples

import std.algorithm.searching : canFind;
import std.algorithm.comparison : equal;
import std.array : array;
import std.range : only, takeNone;
import virc.ircsplitter : IRCSplitter;
{
	auto namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone = #channel :User1 User2 @User3 +User4"));
	assert(namReply.get.chanFlag == NamReplyFlag.public_);
	assert(namReply.get.channel == "#channel");
	auto users = namReply.get.users(['o': '@', 'v': '+']);
	with(users.front) {
		assert(modes.equal(""));
		assert(name == "User1");
	}
	users.popFront();
	with(users.front) {
		assert(modes.equal(""));
		assert(name == "User2");
	}
	users.popFront();
	with(users.front) {
		assert(modes.equal("o"));
		assert(name == "User3");
	}
	users.popFront();
	with(users.front) {
		assert(modes.equal("v"));
		assert(name == "User4");
	}
}
{
	immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone = #channel"));
	assert(namReply.isNull);
}
{
	immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone ="));
	assert(namReply.isNull);
}
{
	immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone"));
	assert(namReply.isNull);
}
{
	immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(takeNone(only("")));
	assert(namReply.isNull);
}

Meta