Module: VivlioStarter::CLI::SamovarCommands::OptionTokenNormalizer::ClassMethods

Defined in:
lib/vivlio_starter/cli/samovar/option_token_normalizer.rb

Overview

コマンドクラス側に生えるヘルパー

Instance Method Summary collapse

Instance Method Details

#all_option_flagsArray<String>

options 定義に現れる全フラグ名。トークンを「オプション」と「位置引数」へ 仕分けるのに使う。BooleanFlag は alternatives--no-xxx を持つため、 prefix と併せて集めれば --no-clean のような否定形も文字列一致で拾える。

Returns:

  • (Array<String>)

    --clean --no-clean -h のようなフラグ名



53
54
55
# File 'lib/vivlio_starter/cli/samovar/option_token_normalizer.rb', line 53

def all_option_flags
  @all_option_flags ||= option_flag_objects.flat_map { [it.prefix, *it.alternatives] }.freeze
end

#options_declared_first?Boolean

オプション群を位置引数より前に並べるべきか。 Samovar の Table#parse は行を宣言順に 1 回ずつ処理し、Optionsinput.first が既知フラグである間しか消費しない。つまりオプションは 「options 行が回ってくる時点で先頭に並んでいる」必要があり、寄せる向きは そのコマンドの宣言順で決まる。

Returns:

  • (Boolean)


73
74
75
76
77
78
79
80
81
82
# File 'lib/vivlio_starter/cli/samovar/option_token_normalizer.rb', line 73

def options_declared_first?
  return @options_declared_first unless @options_declared_first.nil?

  rows = table.merged.each.to_a.select { it.respond_to?(:parse) }
  options_at = rows.index { it.is_a?(Samovar::Options) }
  argument_at = rows.index { it.is_a?(Samovar::Many) || it.is_a?(Samovar::One) }

  # 片方しか持たないコマンドは並べ替えの余地がない(どちらでも結果は同じ)
  @options_declared_first = options_at.nil? || argument_at.nil? || options_at < argument_at
end

#value_option_flagsArray<String>

options 定義から「値を取るフラグ」の名前を集める。 Samovar の ValueFlag は値なしフラグ(--high など)も表現するため、 値プレースホルダを持たないもの(boolean?)を除いて判定する。

Returns:

  • (Array<String>)

    --log -s のようなフラグ名(短縮形を含む)



61
62
63
64
65
66
# File 'lib/vivlio_starter/cli/samovar/option_token_normalizer.rb', line 61

def value_option_flags
  @value_option_flags ||= option_flag_objects
                          .select { it.is_a?(Samovar::ValueFlag) && !it.boolean? }
                          .flat_map { [it.prefix, *it.alternatives] }
                          .freeze
end