package joist.codegen.passes; import joist.codegen.Codegen; import joist.codegen.dtos.CodeEntity; import joist.codegen.dtos.CodeValue; import joist.codegen.dtos.Entity; import joist.domain.Code; import joist.domain.util.Codes; import joist.sourcegen.GClass; import joist.sourcegen.GMethod; public class GenerateCodesPass implements Pass<Codegen> { public void pass(Codegen codegen) { for (Entity entity : codegen.getSchema().getEntities().values()) { if (!entity.isCodeEntity()) { continue; } GClass code = codegen.getOutputCodegenDirectory().getClass(entity.getFullClassName()); code.setEnum().implementsInterface(Code.class); this.addFieldsAndConstructor(code); this.addValues((CodeEntity) entity, code); this.addFromId((CodeEntity) entity, code); this.addFromCode((CodeEntity) entity, code); } } private void addFieldsAndConstructor(GClass code) { code.getField("id").type(Long.class).makeGetter(); code.getField("code").type(String.class).makeGetter(); code.getField("name").type(String.class).makeGetter(); GMethod c = code.getConstructor("Long id", "String code", "String name").setPrivate(); c.body.line("this.id = id;"); c.body.line("this.code = code;"); c.body.line("this.name = name;"); } private void addValues(CodeEntity entity, GClass code) { for (CodeValue value : entity.getCodes()) { code.addEnumValue("{}({}l, \"{}\", \"{}\")", value.getEnumName(), value.id, value.code, value.name); } } private void addFromId(CodeEntity entity, GClass code) { GMethod from = code.getMethod("fromId").returnType(entity.getClassName()).arguments("long id").setStatic(); from.body.line("return {}.fromLong({}.values(), id);", Codes.class.getName(), entity.getClassName()); } private void addFromCode(CodeEntity entity, GClass code) { GMethod from = code.getMethod("fromCode").returnType(entity.getClassName()).arguments("String code").setStatic(); from.body.line("return {}.fromCode({}.values(), code);", Codes.class.getName(), entity.getClassName()); } }