Class: Seam::UrlSearchParams

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/seam/url_search_params.rb

Overview

A mutable, ordered list of name/value string pairs modeling the parts of the WHATWG URLSearchParams interface that the Seam URL search params serializer needs.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(init = nil) ⇒ UrlSearchParams

Returns a new instance of UrlSearchParams.

Parameters:

  • init (String, Hash, Enumerable, nil) (defaults to: nil)


13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/seam/url_search_params.rb', line 13

def initialize(init = nil)
  @pairs = []
  return if init.nil?

  case init
  when String
    query = init.delete_prefix("?")
    URI.decode_www_form(query).each { |name, value| append(name, value) } unless query.empty?
  when Hash
    init.each { |name, value| append(name, value) }
  else
    init.each { |name, value| append(name, value) }
  end
end

Class Method Details

.encode_component(string) ⇒ Object



98
99
100
# File 'lib/seam/url_search_params.rb', line 98

def self.encode_component(string)
  URI.encode_www_form_component(string.encode(Encoding::UTF_8))
end

Instance Method Details

#append(name, value) ⇒ Object



28
29
30
31
# File 'lib/seam/url_search_params.rb', line 28

def append(name, value)
  @pairs << [name.to_s, value.to_s]
  nil
end

#delete(name) ⇒ Object



63
64
65
66
67
# File 'lib/seam/url_search_params.rb', line 63

def delete(name)
  name = name.to_s
  @pairs.reject! { |pair_name, _| pair_name == name }
  nil
end

#each(&block) ⇒ Object



76
77
78
79
80
81
# File 'lib/seam/url_search_params.rb', line 76

def each(&block)
  return @pairs.each unless block

  @pairs.each(&block)
  self
end

#empty?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/seam/url_search_params.rb', line 88

def empty?
  @pairs.empty?
end

#get(name) ⇒ Object



47
48
49
50
51
# File 'lib/seam/url_search_params.rb', line 47

def get(name)
  name = name.to_s
  @pairs.each { |pair_name, value| return value if pair_name == name }
  nil
end

#get_all(name) ⇒ Object



53
54
55
56
# File 'lib/seam/url_search_params.rb', line 53

def get_all(name)
  name = name.to_s
  @pairs.filter_map { |pair_name, value| value if pair_name == name }
end

#has?(name) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
61
# File 'lib/seam/url_search_params.rb', line 58

def has?(name)
  name = name.to_s
  @pairs.any? { |pair_name, _| pair_name == name }
end

#set(name, value) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/seam/url_search_params.rb', line 33

def set(name, value)
  name = name.to_s
  replaced = false
  @pairs = @pairs.filter_map do |pair|
    next pair unless pair.first == name
    next nil if replaced

    replaced = true
    [name, value.to_s]
  end
  append(name, value) unless replaced
  nil
end

#sizeObject Also known as: length



83
84
85
# File 'lib/seam/url_search_params.rb', line 83

def size
  @pairs.size
end

#sort!Object



69
70
71
72
73
74
# File 'lib/seam/url_search_params.rb', line 69

def sort!
  @pairs = @pairs.each_with_index.sort_by do |(name, _), index|
    [name.encode(Encoding::UTF_16BE).b, index]
  end.map(&:first)
  nil
end

#to_sObject



92
93
94
95
96
# File 'lib/seam/url_search_params.rb', line 92

def to_s
  @pairs.map do |name, value|
    "#{self.class.encode_component(name)}=#{self.class.encode_component(value)}"
  end.join("&")
end