Skip to content
This repository was archived by the owner on Aug 16, 2023. It is now read-only.

Commit 09c7bbf

Browse files
committed
Move most of the parsing logic into categories.
1 parent 7cf603e commit 09c7bbf

1 file changed

Lines changed: 48 additions & 42 deletions

File tree

CMDQueryStringSerialization/CMDQueryStringSerialization.m

Lines changed: 48 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ @interface NSString (CMDQueryStringSerialization)
1212

1313
- (NSString *)cmd_stringByAddingEscapes;
1414
- (NSString *)cmd_stringByRemovingEscapes;
15+
- (void)cmd_enumeratePairs:(void (^) (NSString *key, NSString *value))block;
16+
17+
@end
18+
19+
@interface NSMutableDictionary (CMDQueryStringSerialization)
20+
21+
- (void)cmd_addObject:(id)object forKey:(NSString *)key;
1522

1623
@end
1724

@@ -21,49 +28,10 @@ + (NSDictionary *)dictionaryWithQueryString:(NSString *)string {
2128
if (!string) {
2229
return nil;
2330
}
24-
2531
NSMutableDictionary *result = [NSMutableDictionary new];
26-
NSArray *pairs = [string componentsSeparatedByString:@"&"];
27-
28-
for (NSString *pair in pairs) {
29-
if ([pair length] == 0) {
30-
continue;
31-
}
32-
33-
NSRange range = [pair rangeOfString:@"="];
34-
NSString *key;
35-
NSString *value;
36-
37-
if (range.location == NSNotFound) {
38-
key = [pair cmd_stringByRemovingEscapes];
39-
value = @"";
40-
} else {
41-
key = [pair substringToIndex:range.location];
42-
key = [key cmd_stringByRemovingEscapes];
43-
44-
value = [pair substringFromIndex:(range.location + range.length)];
45-
value = [value cmd_stringByRemovingEscapes];
46-
}
47-
48-
if (!key || !value) {
49-
continue;
50-
}
51-
52-
id existingValueForKey = result[key];
53-
54-
if (existingValueForKey) {
55-
result[key] = ^{
56-
if ([existingValueForKey isKindOfClass:[NSArray class]]) {
57-
return [existingValueForKey arrayByAddingObject:value];
58-
} else {
59-
return @[existingValueForKey, value];
60-
}
61-
}();
62-
} else {
63-
result[key] = value;
64-
}
65-
}
66-
32+
[string cmd_enumeratePairs:^(NSString *key, NSString *value) {
33+
[result cmd_addObject:value forKey:key];
34+
}];
6735
return result;
6836
}
6937

@@ -105,4 +73,42 @@ - (NSString *)cmd_stringByRemovingEscapes {
10573
return [self stringByRemovingPercentEncoding];
10674
}
10775

76+
77+
- (void)cmd_enumeratePairs:(void (^) (NSString *key, NSString *value))block {
78+
NSArray *pairs = [self componentsSeparatedByString:@"&"];
79+
[pairs enumerateObjectsUsingBlock:^(NSString *pair, NSUInteger index, BOOL *stop) {
80+
NSRange range = [pair rangeOfString:@"="];
81+
NSString *key, *value;
82+
if (range.location == NSNotFound) {
83+
key = [pair cmd_stringByRemovingEscapes];
84+
value = @"";
85+
} else {
86+
key = [pair substringToIndex:range.location];
87+
key = [key cmd_stringByRemovingEscapes];
88+
value = [pair substringFromIndex:(range.location + range.length)];
89+
value = [value cmd_stringByRemovingEscapes];
90+
}
91+
block(key, value);
92+
}];
93+
}
94+
95+
@end
96+
97+
@implementation NSMutableDictionary (CMDQueryStringSerialization)
98+
99+
- (void)cmd_addObject:(id)object forKey:(NSString *)key {
100+
id existingObject = self[key];
101+
if (existingObject) {
102+
if ([existingObject isKindOfClass:[NSArray class]]) {
103+
self[key] = [existingObject arrayByAddingObject:object];
104+
}
105+
else {
106+
self[key] = @[ existingObject, object ];
107+
}
108+
}
109+
else {
110+
self[key] = object;
111+
}
112+
}
113+
108114
@end

0 commit comments

Comments
 (0)