Skip to content

Commit 24e929f

Browse files
committed
move command data formatters to net/imap/command_data
Partially implements #10.
1 parent 746757b commit 24e929f

File tree

2 files changed

+193
-184
lines changed

2 files changed

+193
-184
lines changed

lib/net/imap.rb

Lines changed: 1 addition & 184 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
rescue LoadError
2323
end
2424

25+
require_relative "imap/command_data"
2526
require_relative "imap/response_data"
2627
require_relative "imap/response_parser"
2728

@@ -1612,190 +1613,6 @@ def start_tls_session(params = {})
16121613
end
16131614
end
16141615

1615-
class RawData # :nodoc:
1616-
def send_data(imap, tag)
1617-
imap.__send__(:put_string, @data)
1618-
end
1619-
1620-
def validate
1621-
end
1622-
1623-
private
1624-
1625-
def initialize(data)
1626-
@data = data
1627-
end
1628-
end
1629-
1630-
class Atom # :nodoc:
1631-
def send_data(imap, tag)
1632-
imap.__send__(:put_string, @data)
1633-
end
1634-
1635-
def validate
1636-
end
1637-
1638-
private
1639-
1640-
def initialize(data)
1641-
@data = data
1642-
end
1643-
end
1644-
1645-
class QuotedString # :nodoc:
1646-
def send_data(imap, tag)
1647-
imap.__send__(:send_quoted_string, @data)
1648-
end
1649-
1650-
def validate
1651-
end
1652-
1653-
private
1654-
1655-
def initialize(data)
1656-
@data = data
1657-
end
1658-
end
1659-
1660-
class Literal # :nodoc:
1661-
def send_data(imap, tag)
1662-
imap.__send__(:send_literal, @data, tag)
1663-
end
1664-
1665-
def validate
1666-
end
1667-
1668-
private
1669-
1670-
def initialize(data)
1671-
@data = data
1672-
end
1673-
end
1674-
1675-
class MessageSet # :nodoc:
1676-
def send_data(imap, tag)
1677-
imap.__send__(:put_string, format_internal(@data))
1678-
end
1679-
1680-
def validate
1681-
validate_internal(@data)
1682-
end
1683-
1684-
private
1685-
1686-
def initialize(data)
1687-
@data = data
1688-
end
1689-
1690-
def format_internal(data)
1691-
case data
1692-
when "*"
1693-
return data
1694-
when Integer
1695-
if data == -1
1696-
return "*"
1697-
else
1698-
return data.to_s
1699-
end
1700-
when Range
1701-
return format_internal(data.first) +
1702-
":" + format_internal(data.last)
1703-
when Array
1704-
return data.collect {|i| format_internal(i)}.join(",")
1705-
when ThreadMember
1706-
return data.seqno.to_s +
1707-
":" + data.children.collect {|i| format_internal(i).join(",")}
1708-
end
1709-
end
1710-
1711-
def validate_internal(data)
1712-
case data
1713-
when "*"
1714-
when Integer
1715-
NumValidator.ensure_nz_number(data)
1716-
when Range
1717-
when Array
1718-
data.each do |i|
1719-
validate_internal(i)
1720-
end
1721-
when ThreadMember
1722-
data.children.each do |i|
1723-
validate_internal(i)
1724-
end
1725-
else
1726-
raise DataFormatError, data.inspect
1727-
end
1728-
end
1729-
end
1730-
1731-
class ClientID # :nodoc:
1732-
1733-
def send_data(imap, tag)
1734-
imap.__send__(:send_data, format_internal(@data), tag)
1735-
end
1736-
1737-
def validate
1738-
validate_internal(@data)
1739-
end
1740-
1741-
private
1742-
1743-
def initialize(data)
1744-
@data = data
1745-
end
1746-
1747-
def validate_internal(client_id)
1748-
client_id.to_h.each do |k,v|
1749-
unless StringFormatter.valid_string?(k)
1750-
raise DataFormatError, client_id.inspect
1751-
end
1752-
end
1753-
rescue NoMethodError, TypeError # to_h failed
1754-
raise DataFormatError, client_id.inspect
1755-
end
1756-
1757-
def format_internal(client_id)
1758-
return nil if client_id.nil?
1759-
client_id.to_h.flat_map {|k,v|
1760-
[StringFormatter.string(k), StringFormatter.nstring(v)]
1761-
}
1762-
end
1763-
1764-
end
1765-
1766-
module StringFormatter
1767-
1768-
LITERAL_REGEX = /[\x80-\xff\r\n]/n
1769-
1770-
module_function
1771-
1772-
# Allows symbols in addition to strings
1773-
def valid_string?(str)
1774-
str.is_a?(Symbol) || str.respond_to?(:to_str)
1775-
end
1776-
1777-
# Allows nil, symbols, and strings
1778-
def valid_nstring?(str)
1779-
str.nil? || valid_string?(str)
1780-
end
1781-
1782-
# coerces using +to_s+
1783-
def string(str)
1784-
str = str.to_s
1785-
if str =~ LITERAL_REGEX
1786-
Literal.new(str)
1787-
else
1788-
QuotedString.new(str)
1789-
end
1790-
end
1791-
1792-
# coerces non-nil using +to_s+
1793-
def nstring(str)
1794-
str.nil? ? nil : string(str)
1795-
end
1796-
1797-
end
1798-
17991616
# Common validators of number and nz_number types
18001617
module NumValidator # :nodoc
18011618
class << self

lib/net/imap/command_data.rb

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# frozen_string_literal: true
2+
3+
module Net
4+
class IMAP < Protocol
5+
6+
7+
class RawData # :nodoc:
8+
def send_data(imap, tag)
9+
imap.__send__(:put_string, @data)
10+
end
11+
12+
def validate
13+
end
14+
15+
private
16+
17+
def initialize(data)
18+
@data = data
19+
end
20+
end
21+
22+
class Atom # :nodoc:
23+
def send_data(imap, tag)
24+
imap.__send__(:put_string, @data)
25+
end
26+
27+
def validate
28+
end
29+
30+
private
31+
32+
def initialize(data)
33+
@data = data
34+
end
35+
end
36+
37+
class QuotedString # :nodoc:
38+
def send_data(imap, tag)
39+
imap.__send__(:send_quoted_string, @data)
40+
end
41+
42+
def validate
43+
end
44+
45+
private
46+
47+
def initialize(data)
48+
@data = data
49+
end
50+
end
51+
52+
class Literal # :nodoc:
53+
def send_data(imap, tag)
54+
imap.__send__(:send_literal, @data, tag)
55+
end
56+
57+
def validate
58+
end
59+
60+
private
61+
62+
def initialize(data)
63+
@data = data
64+
end
65+
end
66+
67+
class MessageSet # :nodoc:
68+
def send_data(imap, tag)
69+
imap.__send__(:put_string, format_internal(@data))
70+
end
71+
72+
def validate
73+
validate_internal(@data)
74+
end
75+
76+
private
77+
78+
def initialize(data)
79+
@data = data
80+
end
81+
82+
def format_internal(data)
83+
case data
84+
when "*"
85+
return data
86+
when Integer
87+
if data == -1
88+
return "*"
89+
else
90+
return data.to_s
91+
end
92+
when Range
93+
return format_internal(data.first) +
94+
":" + format_internal(data.last)
95+
when Array
96+
return data.collect {|i| format_internal(i)}.join(",")
97+
when ThreadMember
98+
return data.seqno.to_s +
99+
":" + data.children.collect {|i| format_internal(i).join(",")}
100+
end
101+
end
102+
103+
def validate_internal(data)
104+
case data
105+
when "*"
106+
when Integer
107+
NumValidator.ensure_nz_number(data)
108+
when Range
109+
when Array
110+
data.each do |i|
111+
validate_internal(i)
112+
end
113+
when ThreadMember
114+
data.children.each do |i|
115+
validate_internal(i)
116+
end
117+
else
118+
raise DataFormatError, data.inspect
119+
end
120+
end
121+
end
122+
123+
class ClientID # :nodoc:
124+
125+
def send_data(imap, tag)
126+
imap.__send__(:send_data, format_internal(@data), tag)
127+
end
128+
129+
def validate
130+
validate_internal(@data)
131+
end
132+
133+
private
134+
135+
def initialize(data)
136+
@data = data
137+
end
138+
139+
def validate_internal(client_id)
140+
client_id.to_h.each do |k,v|
141+
unless StringFormatter.valid_string?(k)
142+
raise DataFormatError, client_id.inspect
143+
end
144+
end
145+
rescue NoMethodError, TypeError # to_h failed
146+
raise DataFormatError, client_id.inspect
147+
end
148+
149+
def format_internal(client_id)
150+
return nil if client_id.nil?
151+
client_id.to_h.flat_map {|k,v|
152+
[StringFormatter.string(k), StringFormatter.nstring(v)]
153+
}
154+
end
155+
156+
end
157+
158+
module StringFormatter
159+
160+
LITERAL_REGEX = /[\x80-\xff\r\n]/n
161+
162+
module_function
163+
164+
# Allows symbols in addition to strings
165+
def valid_string?(str)
166+
str.is_a?(Symbol) || str.respond_to?(:to_str)
167+
end
168+
169+
# Allows nil, symbols, and strings
170+
def valid_nstring?(str)
171+
str.nil? || valid_string?(str)
172+
end
173+
174+
# coerces using +to_s+
175+
def string(str)
176+
str = str.to_s
177+
if str =~ LITERAL_REGEX
178+
Literal.new(str)
179+
else
180+
QuotedString.new(str)
181+
end
182+
end
183+
184+
# coerces non-nil using +to_s+
185+
def nstring(str)
186+
str.nil? ? nil : string(str)
187+
end
188+
189+
end
190+
191+
end
192+
end

0 commit comments

Comments
 (0)