package simpleorm import ( "reflect" "strings" ) type Column struct { Name string FieldName string Type string Modifiers map[string]string } func NewColumn(name string, typ string, fieldName string, tag reflect.StructTag) Column { return Column{name, typ, fieldName, determineModifiers(tag)} } func determineModifiers(tag reflect.StructTag) map[string]string { modifiers := make(map[string]string) sqlTag := tag.Get("sql") if sqlTag == "" { return modifiers } rawModifiers := strings.SplitSeq(sqlTag, ";") for rawModifier := range rawModifiers { if strings.Contains(rawModifier, "=") { keyValue := strings.Split(rawModifier, "=") modifiers[keyValue[0]] = keyValue[1] } else { modifiers[rawModifier] = "" } } return modifiers } func (c *Column) ToDDL() string { var ddlBuilder strings.Builder ddlBuilder.WriteString(c.Name + " " + c.Type) inlineMods := c.inlineModifiers() for _, mod := range inlineMods { ddlBuilder.WriteString(" " + mod) } return ddlBuilder.String() } func (c *Column) inlineModifiers() []string { var mods []string for k, _ := range c.Modifiers { switch k { case "nn": mods = append(mods, "NOT NULL") } } return mods } func (c *Column) IsPK() bool { _, ok := c.Modifiers["pk"] return ok }