# https://github.com/golang/go/issues/28308, from @stapelberg
rules:
- id: sprintf-host-port
  pattern-either:
    - patterns:
        - pattern-either:
          - pattern: fmt.Sprintf("%s:%s", $NET, $XX)
          - pattern: fmt.Sprintf("%s:%d", $NET, $XX)
          - pattern: fmt.Sprintf("%s:%s", $XX, $NET)
          - pattern: fmt.Sprintf("%s:%d", $XX, $NET)
          - pattern: $NET = fmt.Sprintf("%s:%d", ..., ...)
          - pattern: $NET = fmt.Sprintf("%s:%s", ..., ...)
        - metavariable-regex:
            metavariable: '$NET'
            regex: '(?i).*(port|addr|host|listen|bind|ip)'
    - patterns:
      - pattern: fmt.Sprintf($XX, $NET)
      - metavariable-regex:
          metavariable: '$XX'
          regex: '"%s:[0-9]+"'
      - metavariable-regex:
          metavariable: '$NET'
          regex: '(?i).*(port|addr|host|listen|bind|ip)'
  message: |
    use net.JoinHostPort instead of fmt.Sprintf($XX, $NET)
  languages: [go]
  severity: ERROR

