module virc.irckeyvaluesplitter;

import std.typecons : Nullable;

auto splitKeyValues(string input) {
	import std.algorithm.iteration : map, splitter;
	return input.splitter(",").map!keyValuePair();
}

private struct TokenPair {
	string key;
	Nullable!string value;
}

private auto keyValuePair(string token) pure @safe {
	import std.algorithm : findSplit;
	TokenPair result;
	auto splitParams = token.findSplit("=");
	result.key = splitParams[0];
	if (splitParams) {
		result.value = splitParams[2];
	}
	return result;
}

@safe pure unittest {
	import std.algorithm.comparison : equal;
	import std.algorithm.iteration : map;
	import std.range : only;
	{
		auto split = splitKeyValues("foo,maxsub=50,bar");
		assert(split.map!(x => x.key).equal(only("foo", "maxsub", "bar")));
		assert(split.map!(x => x.value).equal(only(Nullable!string.init, Nullable!string("50"), Nullable!string.init)));
	}
}