github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/courier/version_switch.go (about)

     1  package courier
     2  
     3  import (
     4  	"fmt"
     5  	"regexp"
     6  )
     7  
     8  var VersionSwitchKey = "X-Version"
     9  var reVersionSwitch = regexp.MustCompile("@x-version\\(([a-zA-Z_]+)\\)")
    10  
    11  type WithVersionSwitch struct {
    12  	XVersion string `name:"X-Version,omitempty" in:"header"`
    13  }
    14  
    15  func MetadataWithVersionSwitch(xVersion string) Metadata {
    16  	return Metadata{
    17  		VersionSwitchKey: []string{xVersion},
    18  	}
    19  }
    20  
    21  func ModifyRequestIDWithVersionSwitch(requestID string, version string) string {
    22  	others, _, exists := ParseVersionSwitch(requestID)
    23  	if exists {
    24  		requestID = others
    25  	}
    26  	return requestID + fmt.Sprintf("@x-version(%s)", version)
    27  }
    28  
    29  func ParseVersionSwitch(s string) (string, string, bool) {
    30  	version := reVersionSwitch.FindString(s)
    31  	if version == "" {
    32  		return s, version, false
    33  	}
    34  	return reVersionSwitch.ReplaceAllStringFunc(s, func(s string) string {
    35  		version = reVersionSwitch.FindStringSubmatch(s)[1]
    36  		return ""
    37  	}), version, true
    38  }