assign.go 931 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package assign
  2. import (
  3. "git.sxidc.com/go-tools/utils/reflectutils"
  4. "github.com/pkg/errors"
  5. "reflect"
  6. )
  7. type OnParsedFieldTagCallback func(fromFieldName string, fromFieldElemValue reflect.Value, toFieldElementValue reflect.Value, tag *Tag) error
  8. func UseTag(from any, to any, onParsedFieldTagFunc OnParsedFieldTagCallback) error {
  9. if from == nil || to == nil {
  10. return nil
  11. }
  12. fromValue := reflect.ValueOf(from)
  13. toValue := reflect.ValueOf(to)
  14. // 类型校验
  15. if !reflectutils.IsValueStructOrStructPointer(fromValue) {
  16. return errors.New("参数不是结构或结构指针")
  17. }
  18. if !reflectutils.IsValueStructPointer(toValue) {
  19. return errors.New("返回类型不是结构指针")
  20. }
  21. fromElemValue := reflectutils.PointerValueElem(fromValue)
  22. toElemValue := reflectutils.PointerValueElem(toValue)
  23. err := parseTag(fromElemValue, &toElemValue, onParsedFieldTagFunc)
  24. if err != nil {
  25. return err
  26. }
  27. return nil
  28. }