GQLUtil.java

package net.morimekta.providence.graphql.gql;

import net.morimekta.providence.PMessage;
import net.morimekta.providence.descriptor.PField;
import net.morimekta.providence.descriptor.PInterfaceDescriptor;
import net.morimekta.util.Binary;
import net.morimekta.util.Strings;
import net.morimekta.util.json.JsonWriter;

import java.io.PrintWriter;
import java.io.StringWriter;

public class GQLUtil {
    /**
     * Get the based field value for the field. If the containing message is
     * implementing an interface, and this field is a field derived from the
     * interface, this method will return the interface field of same name.
     *
     * @param field The field to get base field for.
     * @return The base field for the field, or itself.
     */
    public static PField<?> baseField(PField<?> field) {
        PInterfaceDescriptor<?> ifd = field.onMessageType().getImplementing();
        if (ifd != null) {
            PField<?> base = ifd.findFieldByName(field.getName());
            if (base != null) {
                return base;
            }
        }
        return field;
    }

    public static String toArgumentString(Object o) {
        if (o instanceof PMessage) {
            PMessage<?>   m       = (PMessage<?>) o;
            StringBuilder builder = new StringBuilder("{");
            boolean       first   = true;
            for (PField<?> pf : m.descriptor().getFields()) {
                if (m.has(pf.getId())) {
                    if (!first) {
                        builder.append(", ");
                    } else {
                        first = false;
                    }
                    builder.append(pf.getName())
                           .append(": ")
                           .append(toArgumentString(m.get(pf.getId())));
                }
            }
            return builder.append("}").toString();
        } else if (o instanceof Binary) {
            return "\"" + ((Binary) o).toBase64() + "\"";
        } else if (o instanceof CharSequence) {
            StringWriter writer = new StringWriter();
            new JsonWriter(new PrintWriter(writer))
                    .value((CharSequence) o)
                    .flush();
            return writer.toString();
        } else {
            return Strings.asString(o);
        }
    }
}