
io.protostuff.compiler.parser.ProtoWalker Maven / Gradle / Ivy
package io.protostuff.compiler.parser;
import io.protostuff.compiler.model.Enum;
import io.protostuff.compiler.model.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Kostiantyn Shchepanovskyi
*/
public class ProtoWalker {
private final ProtoContext context;
private final Proto proto;
private final List> protoProcessors = new ArrayList<>();
private final List> messageProcessors = new ArrayList<>();
private final List> enumProcessors = new ArrayList<>();
private final List> serviceProcessors = new ArrayList<>();
public ProtoWalker(ProtoContext protoContext) {
this.context = protoContext;
this.proto = protoContext.getProto();
}
public static ProtoWalker newInstance(ProtoContext proto) {
return new ProtoWalker(proto);
}
public ProtoWalker onProto(Processor processor) {
protoProcessors.add(processor);
return this;
}
public ProtoWalker onMessage(Processor processor) {
messageProcessors.add(processor);
return this;
}
public ProtoWalker onEnum(Processor processor) {
enumProcessors.add(processor);
return this;
}
public ProtoWalker onService(Processor processor) {
serviceProcessors.add(processor);
return this;
}
public void walk() {
for (Processor protoProcessor : protoProcessors) {
protoProcessor.run(context, proto);
}
walk(proto);
}
private void walk(Proto container) {
List services = container.getServices();
for (Processor serviceProcessor : serviceProcessors) {
for (Service service : services) {
serviceProcessor.run(context, service);
}
}
walk((UserTypeContainer) container);
}
private void walk(UserTypeContainer container) {
List messages = container.getMessages();
for (Processor messageProcessor : messageProcessors) {
for (Message message : messages) {
messageProcessor.run(context, message);
}
}
List enums = container.getEnums();
for (Processor enumProcessor : enumProcessors) {
for (Enum anEnum : enums) {
enumProcessor.run(context, anEnum);
}
}
}
public interface Processor {
void run(ProtoContext context, T t);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy