Class: Pindo::Options::OptionItem

Inherits:
Object
  • Object
show all
Defined in:
lib/pindo/options/core/option_item.rb

Overview

OptionItem 类定义单个参数的所有属性和行为(简化版)

Constant Summary collapse

Boolean =

Boolean 类型标记

:boolean

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key:, **options) ⇒ OptionItem

初始化方法

Parameters:

  • key (Symbol)

    参数键名(必填)

  • options (Hash)

    其他配置选项

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pindo/options/core/option_item.rb', line 24

def initialize(key:, **options)
  raise ArgumentError, "key must be a Symbol" unless key.is_a?(Symbol)

  @key = key
  @description = options[:description] || options[:desc] || ""
  @type = options[:type] || String
  @env_name = options[:env_name]
  @aliases = options[:aliases] || []
  @default_value = options[:default_value] || options[:default]
  @optional = options.fetch(:optional, true)
  @verify_block = options[:verify_block]
  @value_block = options[:value_block]
  @example = options[:example]

  validate_type!
end

Instance Attribute Details

#aliasesObject

Array<Symbol>: 参数别名



11
12
13
# File 'lib/pindo/options/core/option_item.rb', line 11

def aliases
  @aliases
end

#default_valueObject

Any: 默认值



12
13
14
# File 'lib/pindo/options/core/option_item.rb', line 12

def default_value
  @default_value
end

#descriptionObject

String: 参数描述



8
9
10
# File 'lib/pindo/options/core/option_item.rb', line 8

def description
  @description
end

#env_nameObject

String: 环境变量名



10
11
12
# File 'lib/pindo/options/core/option_item.rb', line 10

def env_name
  @env_name
end

#exampleObject

String: 使用示例



16
17
18
# File 'lib/pindo/options/core/option_item.rb', line 16

def example
  @example
end

#keyObject

核心属性



7
8
9
# File 'lib/pindo/options/core/option_item.rb', line 7

def key
  @key
end

#optionalObject

Boolean: 是否可选(默认为 true)



13
14
15
# File 'lib/pindo/options/core/option_item.rb', line 13

def optional
  @optional
end

#typeObject

Class: 数据类型 (String/Integer/Boolean)



9
10
11
# File 'lib/pindo/options/core/option_item.rb', line 9

def type
  @type
end

#value_blockObject

Proc: 获取参数值的 block(交互式输入)



15
16
17
# File 'lib/pindo/options/core/option_item.rb', line 15

def value_block
  @value_block
end

#verify_blockObject

Proc: 自定义验证逻辑



14
15
16
# File 'lib/pindo/options/core/option_item.rb', line 14

def verify_block
  @verify_block
end

Instance Method Details

#auto_convert_value(value) ⇒ Any

自动类型转换

Parameters:

  • value (Any)

    原始值

Returns:

  • (Any)

    转换后的值



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/pindo/options/core/option_item.rb', line 57

def auto_convert_value(value)
  return nil if value.nil?

  case @type
  when Boolean, :boolean
    # Boolean 转换
    if value.is_a?(String)
      return true if value.downcase == 'true' || value == '1'
      return false if value.downcase == 'false' || value == '0'
    end
    !!value
  when Integer
    value.to_i
  else
    # String 或其他类型
    value.to_s
  end
rescue StandardError => e
  raise ArgumentError, "参数 '#{@key}' 类型转换失败: #{e.message}"
end

#boolean?Boolean

判断是否是 Boolean 类型

Returns:



42
43
44
# File 'lib/pindo/options/core/option_item.rb', line 42

def boolean?
  @type == Boolean || @type == :boolean
end

#fetch_env_valueString?

从环境变量读取值

Returns:

  • (String, nil)

    环境变量的值



48
49
50
51
52
# File 'lib/pindo/options/core/option_item.rb', line 48

def fetch_env_value
  return nil unless @env_name
  value = ENV[@env_name]
  value if value && !value.empty?
end

#to_claide_optionArray

转换为 CLAide 选项格式(用于 –help 输出)

Returns:

  • (Array)

    CLAide 选项格式 [option_string, description]



94
95
96
97
98
99
# File 'lib/pindo/options/core/option_item.rb', line 94

def to_claide_option
  option_string = build_option_string
  description_text = build_description_text

  [option_string, description_text]
end

#valid?(value) ⇒ Boolean

验证参数值

Parameters:

  • value (Any)

    要验证的值

Returns:



81
82
83
84
85
86
87
88
89
90
# File 'lib/pindo/options/core/option_item.rb', line 81

def valid?(value)
  return true unless @verify_block

  begin
    @verify_block.call(value)
    true
  rescue StandardError => e
    raise ArgumentError, "参数 '#{@key}' 验证失败: #{e.message}"
  end
end