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  }