2️⃣

Go: 構造体タグの命名規則を静的解析/フォーマットするツール「tagcase」

に公開

Goの構造体タグ(struct tag)が命名規則に沿っているかを静的解析/フォーマットするtagcaseというツールを作りました
スタンドアロンCLIの他にgo vet analyzer、golangci-lintプラグインを公開しているため、今回はそれぞれの使い方を紹介させてください

https://github.com/miyamo2/tagcase

使い方

スタンドアロンCLI

go install github.com/miyamo2/tagcase@latest

Lintルールを記述した設定ファイル(.tagcase.yaml)が必要となるため--initフラグでボイラープレートを出力します

tagcase --init

.tagcase.yaml

# yaml-language-server: $schema=https://raw.githubusercontent.com/miyamo2/tagcase/main/schema.json
# List of tags to check and their expected case.
tags:
  db:
    case: snake_case
  someother:
    # support: snake_case, camelCase, PascalCase, kebab-case, SNAKE_CASE, KEBAB-CASE
    case: camelCase
# List of initialisms to treat as special cases. default: See https://github.com/golang/lint/blob/83fdc39ff7b56453e3793356bcff3070b9b96445/lint.go#L770-L809
#initialism:
#  enable:
#    - BLAH
#  disable:
#    - ID

tagcaseの対象とするタグごとにtags.<構造体タグ名>.caseを記述して命名規則を指定します
caseに設定可能な文字列は以下の6通りです

  • snake_case
  • kebab-case
  • camelCase
  • PascalCase
  • SNAKE_CASE
  • KEBAB-CASE

--writeフラグを使用することで命名規則に沿うようフォーマットすることができます

tagcase --write <対象のGoファイル>

また、--diffフラグでフォーマットを行わず、命名規則との差分を検知することも可能です

tagcase --diff <対象のGoファイル>

go vet analyzer

go install github.com/miyamo2/tagcase/cmd/tagcase-analyzer@latest

スタンドアロンCLIと同様に .tagcase.yaml が必須となります
ボイラープレートを生成するためにスタンドアロンCLIもあわせてインストールすると便利です

go install github.com/miyamo2/tagcase@latest
tagcase --init
go vet -vettool=$(which tagcase-analyzer) ./...

golangci-lintプラグイン

Module Plugin Systemを利用してgolangci-lintに組み込むことができます

.custom-gcl.yml

version: v2.2.0
plugins:
  - module: 'github.com/miyamo2/tagcase'
    import: 'github.com/miyamo2/tagcase/pkg/golangci-lint/plugin'
    version: latest
golangci-lint custom

golangci-lintプラグインとして利用する場合は .tagcase.yaml は不要です
代わりに golangci-lint の設定ファイル内にtagcaseのLintルールを記述する必要があります

.golangci.yaml

version: "2"
linters:
  settings:
    custom:
      tagcase:
        type: "module"
        settings:
          # 以下 .tagcase.yaml と同様のスキーマ
          tags:
            db:
              case: snake_case
./custom-gcl run .

GitHubで編集を提案

Discussion