All Downloads are FREE. Search and download functionalities are using the official Maven repository.

farm.nurture.laminar.generator.ast.golang.AstMakeVO Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright 2022 Nurture.Farm
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package farm.nurture.laminar.generator.ast.golang;

import static farm.nurture.laminar.generator.Constants.BOOL;
import static farm.nurture.laminar.generator.Constants.CODE_URL;
import static farm.nurture.laminar.generator.Constants.DATETIME;
import static farm.nurture.laminar.generator.Constants.ENUM;
import static farm.nurture.laminar.generator.Constants.FLOAT64;
import static farm.nurture.laminar.generator.Constants.FORWARD_SLASH;
import static farm.nurture.laminar.generator.Constants.GO_PACKAGE;
import static farm.nurture.laminar.generator.Constants.GO_PROTO_PATH;
import static farm.nurture.laminar.generator.Constants.INT32;
import static farm.nurture.laminar.generator.Constants.INT64;
import static farm.nurture.laminar.generator.Constants.MODEL_DOT;
import static farm.nurture.laminar.generator.Constants.NAME_SPACE;
import static farm.nurture.laminar.generator.Constants.SERVICE_NAME;
import static farm.nurture.laminar.generator.Constants.STRING;
import static farm.nurture.laminar.generator.Constants.TIMESTAMP;

import farm.nurture.infra.util.Logger;
import farm.nurture.infra.util.LoggerFactory;
import farm.nurture.infra.util.StringUtils;
import farm.nurture.laminar.core.util.CaseUtils;
import farm.nurture.laminar.generator.AppConfigVO;
import farm.nurture.laminar.generator.Configuration;
import farm.nurture.laminar.generator.FieldDetail;
import farm.nurture.laminar.generator.TemplatesVO;
import farm.nurture.laminar.generator.ast.AstBase;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class AstMakeVO extends AstBase {

    private List parts = new ArrayList<>();
    private Set makeVOSet = new HashSet<>();
    private StringBuilder mapperBuf = new StringBuilder();
    private AstBase.Flags flags;
    private static final Logger logger = LoggerFactory.getLogger(AstMakeVO.class);

    public AstMakeVO() {
        /*Constructor*/
    }

    @Override
    public void onStart(Configuration conf, Flags flags) {
        super.onStart(conf, flags);
        this.flags = flags;
        for (AstBase b : parts) b.onStart(conf, flags);
    }

    @Override
    public void onEntry(
        AppConfigVO entry, List requestFields, List responseFields) {

        for (AstBase b : parts) b.onEntry(entry, requestFields, responseFields);
        if (entry.isImplDao()) {
            if (entry.isMutation()) {
                if (makeVOSet.contains(entry.getReqName())) return;
                parameterHandling(
                    entry.isMutation(), entry.getReqName(), entry.getResName(), requestFields, mapperBuf);
                makeVOSet.add(entry.getReqName());
            } else {
                if (makeVOSet.contains(entry.getResName())) return;
                parameterHandling(
                    entry.isMutation(), entry.getReqName(), entry.getResName(), responseFields, mapperBuf);
                makeVOSet.add(entry.getResName());

                parameterHandling(
                    true, entry.getReqName(), entry.getResName(), requestFields, mapperBuf);
                makeVOSet.add(entry.getReqName());
            }
        }
    }

    @Override
    public void onEnd() {
        super.onEnd();
        for (AstBase b : parts) b.onEnd();

        String namespace = super.getNamespace();
        if (StringUtils.isNonEmpty(namespace)) {
            namespace = FORWARD_SLASH + namespace;
        }

        String mapperContent =
            readTemplateFile(TemplatesVO.getTEMPLATE_DIR() + "/golang/database/mappers/mappers.go.template");
        if (flags.isContracts()) {
            mapperContent =
                mapperContent.replace(
                    GO_PROTO_PATH,
                    "\"code.nurture.farm/Core/Contracts/" + super.getServiceName()
                        + "/Gen/Go" + super.getServiceName() + "\"");
        } else {
            mapperContent =
                mapperContent.replace(
                    GO_PROTO_PATH,
                    "\"" + super.getCodeUrl() + namespace + FORWARD_SLASH + super.getServiceName()
                        + "/zerotouch/golang/proto/" + super.getGoPackage() + FORWARD_SLASH + super.getServiceName()
                        + "\"");
        }
        mapperContent = mapperContent.replace(CODE_URL, getCodeUrl());
        mapperContent = mapperContent.replace(NAME_SPACE, namespace);
        mapperContent = mapperContent.replace(SERVICE_NAME, getServiceName());
        mapperContent = mapperContent.replace(GO_PACKAGE, super.getGoPackage());
        mapperContent = mapperContent.replace("@insert_maps@", mapperBuf.toString());

        File pj = new File(getGoGeneratePath() + "/database/mappers");
        if (!pj.exists()) pj.mkdirs();

        writeToFile(super.getGoGeneratePath() + "/database/mappers/mappers.go", mapperContent);
    }

    void parameterHandling(
        Boolean isMutation,
        String requestName,
        String responseName,
        List paramDetails,
        StringBuilder mapperBuf) {

        processIsMutation(isMutation, requestName, responseName, mapperBuf);

        if (!paramDetails.isEmpty()) {
            if (Boolean.TRUE.equals(isMutation)) {
                mapperBuf.append("\n\treturn &models." + requestName + "VO { \n\t\t");
            } else {
                mapperBuf.append("\n\treturn &fs." + responseName + "Record { \n\t\t");
            }
            boolean isFirst = true;
            Map> msgNames = new HashMap<>();
            processParamDetails(isMutation, paramDetails, mapperBuf, isFirst, msgNames);
            processMsgNames(isMutation, mapperBuf, isFirst, msgNames);
            mapperBuf.append(",\n\t}\n\n}\n");
        } else {
            mapperBuf.append("\n\treturn nil  \n}\n");
        }
    }

    private void processMsgNames(
        Boolean isMutation,
        StringBuilder mapperBuf,
        boolean isFirst,
        Map> msgNames) {
        for (Map.Entry> entry : msgNames.entrySet()) {

            if (isFirst) isFirst = false;
            else mapperBuf.append(",\n\t\t");

            String msgname = entry.getKey().toLowerCase();
            msgname = Character.toUpperCase(msgname.charAt(0)) + msgname.substring(1);

            mapperBuf.append(msgname).append(": &fs.").append(entry.getKey()).append("{\n\t\t\t");
            for (FieldDetail aParam : entry.getValue()) {

                int dotPos = aParam.getFieldName().indexOf('.');
                String fldName = aParam.getFieldName().substring(dotPos + 1);
                mapperBuf.append(CaseUtils.toCamelCase(fldName, true, '_')).append(":");
                String paramName = aParam.getFldNameCamel();
                paramName = Character.toUpperCase(paramName.charAt(0)) + paramName.substring(1);
                setVOType(aParam.getGoType(), paramName, isMutation, mapperBuf);
                mapperBuf.append(",\n\t\t\t");
            }
            mapperBuf.append("\n\t\t}");
        }
    }

    private void processParamDetails(
        Boolean isMutation,
        List paramDetails,
        StringBuilder mapperBuf,
        boolean isFirst,
        Map> msgNames) {
        for (FieldDetail aParam : paramDetails) {

            int dotPos = aParam.getFieldName().indexOf('.');
            if (dotPos >= 0) {
                String msgname = aParam.getFieldName().substring(0, dotPos);
                if (msgNames.containsKey(msgname)) {
                    msgNames.get(msgname).add(aParam);
                } else {
                    List fldNames = new ArrayList<>();
                    fldNames.add(aParam);
                    msgNames.put(msgname, fldNames);
                }
            } else {
                String fldName = aParam.getFldNameCamel();
                if (isFirst) isFirst = false;
                else mapperBuf.append(",\n\t\t");

                String paramName = Character.toUpperCase(fldName.charAt(0)) + fldName.substring(1);

                mapperBuf.append(paramName).append(": ");

                setVOType(aParam.getGoType(), paramName, isMutation, mapperBuf);
            }
        }
    }

    private void processIsMutation(
        Boolean isMutation, String requestName, String responseName, StringBuilder mapperBuf) {
        if (Boolean.TRUE.equals(isMutation)) {
            mapperBuf
                .append("func Make")
                .append(requestName)
                .append("VO(request *fs.")
                .append(requestName)
                .append(") *models.")
                .append(requestName)
                .append("VO {\n");
        } else {
            mapperBuf
                .append("func Make")
                .append(responseName)
                .append("VO(model *models.")
                .append(responseName)
                .append("VO) *fs.")
                .append(responseName)
                .append("Record {\n");
        }
    }

    void setVOType(String type, String paramName, boolean isMutation, StringBuilder mapperBuf) {

        if (type.equals(STRING)) {
            if (isMutation) {
                mapperBuf.append("getNullableString(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".String");
            }
        } else if (type.startsWith(ENUM)) {
            if (isMutation) {
                mapperBuf.append("getNullableString(request.").append(paramName).append(".String())");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".String");
            }
        } else if (type.equals(BOOL)) {
            if (isMutation) {
                mapperBuf.append("getNullableBool(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".Bool");
            }
            //    } else if (type.equals("time.Time")) {
            //      if (isMutation) {
            //        mapperBuf.append("getNullableTimestamp(request.").append(paramName).append(")");
            //      } else {
            //        mapperBuf.append(MODEL_DOT).append(paramName).append(".Time.Unix()");
            //      }
        } else if (type.equals(DATETIME)) {
            if (isMutation) {
                mapperBuf.append("getNullableDateTime(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".Time.Unix()");
            }
        } else if (type.equals(TIMESTAMP)) {
            if (isMutation) {
                mapperBuf.append("getNullableTimestamp(request.").append(paramName).append(")");
            } else {
                mapperBuf.append("getProtoTime(model.").append(paramName).append(".String)");
            }
        } else if (type.equals(INT32)) {
            if (isMutation) {
                mapperBuf.append("getNullableInt32(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".Int32");
            }
        } else if (type.equals(INT64)) {
            if (isMutation) {
                mapperBuf.append("getNullableInt64(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".Int64");
            }
        } else if (type.equals(FLOAT64)) {
            if (isMutation) {
                mapperBuf.append("getNullableFloat64(request.").append(paramName).append(")");
            } else {
                mapperBuf.append(MODEL_DOT).append(paramName).append(".Float64");
            }
        } else if (type.equals("[]string")) {
            if (isMutation) {
                mapperBuf.append("getNullableStrings(request.").append(paramName).append(")");
            }
        } else {
            logger.error("TODO1 data type" + type);
            System.exit(1);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy