github.com/iEvan-lhr/exciting-tool@v0.0.0-20230504054234-8e983f73cdd2/str_tool.go (about) 1 package tools 2 3 import ( 4 "reflect" 5 "time" 6 "unicode/utf8" 7 ) 8 9 const timeLayout = "2006-01-02 15:04:05" 10 const EndMessage = "----------END----------" 11 const Select = "select * from " 12 13 func inTF(i, j int) bool { 14 return i == j 15 } 16 17 func (s *String) strTime(t time.Time) { 18 const bufSize = 64 19 var b []byte 20 var buf [bufSize]byte 21 b = buf[:0] 22 s.appendAny(t.AppendFormat(b, timeLayout)) 23 } 24 25 func marshalStruct(model any) (result []*String) { 26 values, typ := returnValAndTyp(model) 27 switch values.Kind() { 28 case reflect.Struct: 29 return generateModel(values, typ) 30 case reflect.Slice: 31 return generateModels(values) 32 } 33 return nil 34 } 35 36 func generateModel(values reflect.Value, types reflect.Type) (result []*String) { 37 s := Make("insert into ") 38 s.cutHumpMessage(values.String()) 39 tags := Make(" (") 40 vars := Make(" values(") 41 for j := 0; j < types.NumField(); j++ { 42 switch types.Field(j).Tag.Get("marshal") { 43 case "off": 44 case "auto_insert": 45 tags.Append("`", humpName(types.Field(j).Name), "`,") 46 vars.appendAny("NULL,") 47 default: 48 tags.Append("`", humpName(types.Field(j).Name), "`,") 49 vars.Append("'", righteousCharacter(Make(values.Field(j).Interface())), "',") 50 } 51 } 52 tags.ReplaceLastStr(1, ")") 53 vars.ReplaceLastStr(1, ")") 54 s.Append(tags, vars) 55 result = append(result, s) 56 return 57 } 58 59 func generateModels(values reflect.Value) (result []*String) { 60 if !(values.Len() > 0) { 61 return 62 } 63 head, lens := generateHead(values.Index(0).Interface()) 64 s := Make(head) 65 for i := 0; i < values.Len(); i++ { 66 v, t := returnValAndTyp(values.Index(i).Interface()) 67 if i != 0 && i%200 == 0 { 68 s.ReplaceLastStr(1, ";\n") 69 result = append(result, s) 70 s = Make(head) 71 } 72 vars := Make("(") 73 for j := 0; j < lens; j++ { 74 switch t.Field(j).Tag.Get("marshal") { 75 case "off": 76 case "auto_insert": 77 vars.appendAny("NULL,") 78 default: 79 vars.Append("'", righteousCharacter(Make(v.Field(j).Interface())), "',") 80 } 81 } 82 vars.ReplaceLastStr(1, "),") 83 s.appendAny(vars) 84 } 85 s.ReplaceLastStr(1, ";") 86 result = append(result, s) 87 return 88 } 89 90 func generateHead(model any) (*String, int) { 91 values, typ := returnValAndTyp(model) 92 s := Make("insert into ") 93 s.cutHumpMessage(values.String()) 94 tags := Make(" (") 95 for j := 0; j < typ.NumField(); j++ { 96 switch typ.Field(j).Tag.Get("marshal") { 97 case "off": 98 case "auto_insert": 99 tags.Append("`", humpName(typ.Field(j).Name), "`,") 100 default: 101 tags.Append("`", humpName(typ.Field(j).Name), "`,") 102 } 103 } 104 tags.ReplaceLastStr(1, ")") 105 s.Append(tags, " values") 106 return s, typ.NumField() 107 } 108 109 func (s *String) queryStruct(model any) { 110 values, typ := returnValAndTyp(model) 111 s.appendAny(Select) 112 s.cutHumpMessage(values.String()) 113 var where byte 114 for j := 0; j < typ.NumField(); j++ { 115 if !values.Field(j).IsZero() { 116 if where == 0 { 117 s.appendAny(" where ") 118 where++ 119 } else { 120 s.appendAny(" and ") 121 } 122 switch values.Field(j).Kind() { 123 case reflect.Slice: 124 default: 125 s.Append(humpName(typ.Field(j).Name), "=", "'", righteousCharacter(Make(values.Field(j).Interface())), "'") 126 } 127 } 128 } 129 } 130 131 func (s *String) checkStruct(model any) { 132 values, typ := returnValAndTyp(model) 133 s.appendAny(Select) 134 s.cutHumpMessage(values.String()) 135 var where byte 136 for j := 0; j < typ.NumField(); j++ { 137 if !values.Field(j).IsZero() && typ.Field(j).Tag.Get("marshal") == "check" { 138 if where == 0 { 139 s.appendAny(" where ") 140 where++ 141 } else { 142 s.appendAny(" and ") 143 } 144 switch values.Field(j).Kind() { 145 case reflect.Slice: 146 default: 147 s.Append(humpName(typ.Field(j).Name), "=", "'", righteousCharacter(Make(values.Field(j).Interface())), "'") 148 } 149 } 150 } 151 } 152 153 func (s *String) cutStructMessage(sm string) { 154 sms := Make(sm) 155 split := sms.Split(".") 156 sms.coverWrite(split[len(split)-1]) 157 s.Append("\n", "----------", sms.Split(" ")[0], "----------", "\n") 158 } 159 160 func (s *String) cutHumpMessage(hump string) { 161 sms := Make(hump) 162 split := sms.Split(".") 163 sms.coverWrite(split[len(split)-1]) 164 sms.coverWrite(humpName(sms.Split(" ")[0])) 165 s.appendAny(sms) 166 } 167 168 // AppendSpilt 拼接字符串后返回String 169 func (s *String) AppendSpilt(join ...any) *String { 170 var split = &String{} 171 for i := range join { 172 if i == 0 { 173 split.Append(join[i]) 174 } else if i == len(join)-1 { 175 s.appendAny(join[i]) 176 } else { 177 s.appendAny(join[i]) 178 s.Append(split) 179 } 180 181 } 182 return s 183 } 184 185 // AppendSpiltLR 拼接字符串后返回String 186 func (s *String) AppendSpiltLR(join ...any) *String { 187 var split, l, r = &String{}, &String{}, &String{} 188 if len(join) < 3 { 189 panic("Add Lens<3") 190 } 191 split.appendAny(join[0]) 192 l.appendAny(join[1]) 193 r.appendAny(join[2]) 194 for i := 3; i < len(join)-1; i++ { 195 s.appendAny(l) 196 s.appendAny(join[i]) 197 s.appendAny(r) 198 s.Append(split) 199 } 200 s.appendAny(l) 201 s.appendAny(join[len(join)-1]) 202 s.appendAny(r) 203 return s 204 } 205 206 // checkBytes 比较两个byte切片的值 207 func checkBytes(s, str []byte) bool { 208 if inTF(len(s), len(str)) { 209 for i, v := range str { 210 if s[i] != v { 211 return false 212 } 213 } 214 return true 215 } 216 return false 217 } 218 219 // RunesToBytes Runes转bytes 220 func runesToBytes(rune []rune) []byte { 221 size := 0 222 for _, r := range rune { 223 size += utf8.RuneLen(r) 224 } 225 bs := make([]byte, size) 226 count := 0 227 for _, r := range rune { 228 count += utf8.EncodeRune(bs[count:], r) 229 } 230 return bs 231 } 232 func (s *String) Marshal(model any) { 233 values, types := returnValAndTyp(model) 234 s.cutStructMessage(values.String()) 235 for j := 0; j < types.NumField(); j++ { 236 if types.Field(j).Tag.Get("marshal") != "off" { 237 s.Append(types.Field(j).Name, ":", values.Field(j).Interface(), "\n") 238 } 239 } 240 s.appendAny(EndMessage) 241 } 242 243 func returnValAndTyp(model any) (values reflect.Value, types reflect.Type) { 244 switch reflect.ValueOf(model).Kind() { 245 case reflect.Struct, reflect.Slice: 246 values = reflect.ValueOf(model) 247 types = reflect.TypeOf(model) 248 case reflect.Pointer: 249 values = reflect.ValueOf(model).Elem() 250 types = reflect.TypeOf(model).Elem() 251 case reflect.Map: 252 253 } 254 return 255 } 256 257 func MarshalMap(model any) map[string]string { 258 modelMap := make(map[string]string) 259 var values reflect.Value 260 var types reflect.Type 261 switch reflect.ValueOf(model).Kind() { 262 case reflect.Struct: 263 values = reflect.ValueOf(model) 264 types = reflect.TypeOf(model) 265 case reflect.Pointer: 266 values = reflect.ValueOf(model).Elem() 267 types = reflect.TypeOf(model).Elem() 268 } 269 modelMap["StructName"] = cutStructMessage(values.String()) 270 for j := 0; j < types.NumField(); j++ { 271 if types.Field(j).Tag.Get("marshal") != "off" { 272 modelMap[types.Field(j).Name] = Make(values.Field(j).Interface()).string() 273 } 274 } 275 return modelMap 276 }