package tc.oc.minecraft.server;
import javax.inject.Inject;
import org.w3c.dom.Element;
import tc.oc.api.docs.virtual.MapDoc;
import tc.oc.api.docs.virtual.ServerDoc;
import tc.oc.parse.ParseException;
import tc.oc.parse.xml.ElementParser;
import tc.oc.parse.xml.NodeParser;
import tc.oc.parse.xml.XML;
/**
* Parses a {@link ServerFilter} from any {@link Element} by collecting
* child elements named after the filter fields. Any element can appear
* multiple times.
*
* <whatever>
* <role>...</role> {@link ServerFilter#roles()}
* <network>...</network> {@link ServerFilter#networks()}
* <realm>...</realm> {@link ServerFilter#realms()}
* <game>...</game> {@link ServerFilter#games()}
* <gamemode>...</gamemode> {@link ServerFilter#gamemodes()}
* </whatever>
*/
public class ServerFilterParser implements ElementParser<ServerFilter> {
private final NodeParser<ServerDoc.Role> roleParser;
private final NodeParser<ServerDoc.Network> networkParser;
private final NodeParser<MapDoc.Gamemode> gamemodeParser;
@Inject ServerFilterParser(NodeParser<ServerDoc.Role> roleParser, NodeParser<ServerDoc.Network> networkParser, NodeParser<MapDoc.Gamemode> gamemodeParser) {
this.roleParser = roleParser;
this.networkParser = networkParser;
this.gamemodeParser = gamemodeParser;
}
@Override
public ServerFilter parse(Element el) throws ParseException {
return new ServerFilter(
XML.childrenNamed(el, "role").map(roleParser::parse),
XML.childrenNamed(el, "network").map(networkParser::parse),
XML.childrenNamed(el, "realm").map(Element::getTextContent),
XML.childrenNamed(el, "game").map(Element::getTextContent),
XML.childrenNamed(el, "gamemode").map(gamemodeParser::parse)
);
}
}