github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/pkg/service/fix.go (about)

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  	"strconv"
     7  	"strings"
     8  
     9  	"log"
    10  
    11  	consts "github.com/easysoft/zendata/internal/pkg/const"
    12  	"github.com/easysoft/zendata/internal/pkg/domain"
    13  	"github.com/easysoft/zendata/internal/pkg/helper"
    14  	commonUtils "github.com/easysoft/zendata/pkg/utils/common"
    15  	"github.com/easysoft/zendata/pkg/utils/vari"
    16  	"github.com/mattn/go-runewidth"
    17  )
    18  
    19  type FixService struct {
    20  }
    21  
    22  func (s *FixService) AddFix(val interface{}, field *domain.DefField, count int, withFix bool) (ret interface{}) {
    23  	prefix := s.getStrValueFromFixRange(field.PrefixRange, count)
    24  	postfix := s.getStrValueFromFixRange(field.PostfixRange, count)
    25  	divider := field.Divider
    26  	length := field.Length
    27  
    28  	ret = val
    29  
    30  	if prefix == "" && postfix == "" && length == 0 && len(divider) == 0 {
    31  		return
    32  	}
    33  
    34  	if length > runewidth.StringWidth(fmt.Sprintf("%v", ret)) {
    35  		ret = helper.AddPad(fmt.Sprintf("%v", ret), *field)
    36  	}
    37  
    38  	if withFix && !vari.GlobalVars.Trim {
    39  		ret = prefix + fmt.Sprintf("%v", ret) + postfix
    40  	}
    41  
    42  	if vari.GlobalVars.OutputFormat == consts.FormatText && !vari.GlobalVars.Trim {
    43  		ret = fmt.Sprintf("%v", ret) + divider
    44  	}
    45  
    46  	if commonUtils.GetType(ret) == "string" {
    47  		//ret = s.TrimIfFormatIsNotText(fmt.Sprintf("%v", ret))
    48  	}
    49  
    50  	return
    51  }
    52  
    53  func (s *FixService) getStrValueFromFixRange(rang *domain.Range, index int) string {
    54  	if rang == nil || len(rang.Values) == 0 {
    55  		return ""
    56  	}
    57  
    58  	idx := index % len(rang.Values)
    59  	x := rang.Values[idx]
    60  
    61  	return s.convPrefixVal2Str(x, "")
    62  }
    63  
    64  func (s *FixService) convPrefixVal2Str(val interface{}, format string) string {
    65  	str := consts.Na
    66  	success := false
    67  
    68  	switch val.(type) {
    69  	case int64:
    70  		if format != "" {
    71  			str, success = helper.FormatStr(format, val.(int64), 0)
    72  		}
    73  		if !success {
    74  			str = strconv.FormatInt(val.(int64), 10)
    75  		}
    76  	case float64:
    77  		precision := 0
    78  		if format != "" {
    79  			str, success = helper.FormatStr(format, val.(float64), precision)
    80  		}
    81  		if !success {
    82  			str = strconv.FormatFloat(val.(float64), 'f', precision, 64)
    83  		}
    84  	case byte:
    85  		str = string(val.(byte))
    86  		if format != "" {
    87  			str, success = helper.FormatStr(format, str, 0)
    88  		}
    89  		if !success {
    90  			str = string(val.(byte))
    91  		}
    92  	case string:
    93  		str = val.(string)
    94  
    95  		match, _ := regexp.MatchString("%[0-9]*d", format)
    96  		if match {
    97  			valInt, err := strconv.Atoi(str)
    98  			if err == nil {
    99  				str, success = helper.FormatStr(format, valInt, 0)
   100  			}
   101  		} else {
   102  			str, success = helper.FormatStr(format, str, 0)
   103  		}
   104  	default:
   105  	}
   106  
   107  	if str == consts.Na {
   108  		log.Println(str)
   109  	}
   110  
   111  	return str
   112  }
   113  
   114  func (s *FixService) TrimIfFormatIsNotText(str string) (ret string) {
   115  	ret = str
   116  
   117  	if vari.GlobalVars.OutputFormat != "" && vari.GlobalVars.OutputFormat != consts.FormatText {
   118  		ret = strings.TrimSpace(ret)
   119  	}
   120  
   121  	return
   122  }