Class: HaveAPI::Parameters::Typed

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/parameters/typed.rb

Constant Summary collapse

ATTRIBUTES =
%i[
  label desc type db_name default fill clean protected load_validators
  nullable symbolize_keys
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, args = {}) ⇒ Typed

Returns a new instance of Typed.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/haveapi/parameters/typed.rb', line 13

def initialize(name, args = {})
  # The hash values are deleted and it shouldn't affect the received hash
  myargs = args.clone

  @name = name
  @label = myargs.delete(:label) || name.to_s.capitalize
  @layout = :custom

  (ATTRIBUTES - %i[label]).each do |attr|
    instance_variable_set("@#{attr}", myargs.delete(attr))
  end

  @type ||= String

  @validators = HaveAPI::ValidatorChain.new(myargs) unless myargs.empty?
  raise "unused arguments #{myargs}" unless myargs.empty?
end

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



11
12
13
# File 'lib/haveapi/parameters/typed.rb', line 11

def default
  @default
end

#descObject (readonly)

Returns the value of attribute desc.



11
12
13
# File 'lib/haveapi/parameters/typed.rb', line 11

def desc
  @desc
end

#labelObject (readonly)

Returns the value of attribute label.



11
12
13
# File 'lib/haveapi/parameters/typed.rb', line 11

def label
  @label
end

#nameObject (readonly)

Returns the value of attribute name.



11
12
13
# File 'lib/haveapi/parameters/typed.rb', line 11

def name
  @name
end

#typeObject (readonly)

Returns the value of attribute type.



11
12
13
# File 'lib/haveapi/parameters/typed.rb', line 11

def type
  @type
end

Instance Method Details

#add_validator(k, v) ⇒ Object



68
69
70
71
# File 'lib/haveapi/parameters/typed.rb', line 68

def add_validator(k, v)
  @validators ||= HaveAPI::ValidatorChain.new({})
  @validators.add_or_replace(k, v)
end

#clean(raw) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/haveapi/parameters/typed.rb', line 84

def clean(raw)
  clean_raw = custom? ? normalize_custom_keys(raw) : raw
  return validate_cleaned_value(instance_exec(clean_raw, &@clean)) if @clean

  if raw.nil?
    return nil if nullable?

    raise HaveAPI::ValidationError, 'cannot be null'
  end

  if raw.is_a?(String)
    stripped = strip_string(raw)
    return nil if stripped.empty? && nullable?
  end

  if @type.nil?
    nil

  elsif @type == Integer
    coerce_integer(raw)

  elsif @type == Float
    coerce_float(raw)

  elsif @type == Boolean
    coerce_boolean(raw)

  elsif @type == ::Datetime
    coerce_datetime(raw)

  elsif @type == String || @type == Text
    coerce_string(raw)

  elsif custom?
    clean_raw

  else
    raw
  end
end

#db_nameObject



31
32
33
# File 'lib/haveapi/parameters/typed.rb', line 31

def db_name
  @db_name || @name
end

#describe(context) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/haveapi/parameters/typed.rb', line 55

def describe(context)
  {
    required: required?,
    nullable: nullable?,
    label: @label,
    description: @desc,
    type: @type ? @type.to_s : String.to_s,
    validators: @validators ? @validators.describe : {},
    default: @default,
    protected: @protected || false
  }
end

#fill?Boolean

Returns:



47
48
49
# File 'lib/haveapi/parameters/typed.rb', line 47

def fill?
  @fill
end

#format_output(v) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/haveapi/parameters/typed.rb', line 129

def format_output(v)
  if v.nil?
    nil

  elsif @type == ::Datetime && v.is_a?(Time)
    v.iso8601

  elsif @type == Boolean
    v ? true : false

  elsif @type == Integer
    v.to_i

  elsif @type == Float
    v.to_f

  elsif @type == String || @type == Text
    v.to_s

  else
    v
  end
end

#load_validators?Boolean

Returns:



51
52
53
# File 'lib/haveapi/parameters/typed.rb', line 51

def load_validators?
  @load_validators.nil? || @load_validators
end

#nullable?Boolean

Returns:



43
44
45
# File 'lib/haveapi/parameters/typed.rb', line 43

def nullable?
  @nullable == true && optional?
end

#optional?Boolean

Returns:



39
40
41
# File 'lib/haveapi/parameters/typed.rb', line 39

def optional?
  !required?
end

#patch(attrs) ⇒ Object



73
74
75
76
77
78
79
80
81
82
# File 'lib/haveapi/parameters/typed.rb', line 73

def patch(attrs)
  attrs.each do |k, v|
    if ATTRIBUTES.include?(k)
      instance_variable_set("@#{k}", v)

    else
      add_validator(k, v)
    end
  end
end

#required?Boolean

Returns:



35
36
37
# File 'lib/haveapi/parameters/typed.rb', line 35

def required?
  @validators ? @validators.required? : false
end

#validate(v, params) ⇒ Object



125
126
127
# File 'lib/haveapi/parameters/typed.rb', line 125

def validate(v, params)
  @validators ? @validators.validate(v, params) : true
end