69: def normalize_params(params, name, v = nil)
70: name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
71: k = $1 || ''
72: after = $' || ''
73:
74: return if k.empty?
75:
76: if after == ""
77: params[k] = v
78: elsif after == "[]"
79: params[k] ||= []
80: raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
81: params[k] << v
82: elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
83: child_key = $1
84: params[k] ||= []
85: raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
86: if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key)
87: normalize_params(params[k].last, child_key, v)
88: else
89: params[k] << normalize_params({}, child_key, v)
90: end
91: else
92: params[k] ||= {}
93: raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash)
94: params[k] = normalize_params(params[k], after, v)
95: end
96:
97: return params
98: end