Skip to content

Commit 7535486

Browse files
committed
simplify iterator structs
1 parent 040bb54 commit 7535486

File tree

3 files changed

+84
-54
lines changed

3 files changed

+84
-54
lines changed

src/ffi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ extern "C" {
285285
pub fn ada_free_search_params_entries_iter(iter: *mut ada_url_search_params_entries_iter);
286286
pub fn ada_search_params_entries_iter_next(
287287
iter: *mut ada_url_search_params_entries_iter,
288-
) -> *mut ada_string_pair;
288+
) -> ada_string_pair;
289289
pub fn ada_search_params_entries_iter_has_next(
290290
iter: *mut ada_url_search_params_entries_iter,
291291
) -> bool;

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ mod idna;
4747
mod url_search_params;
4848
pub use idna::Idna;
4949
pub use url_search_params::{
50-
URLSearchParams, URLSearchParamsEntry, URLSearchParamsKeysIterator,
51-
URLSearchParamsValuesIterator,
50+
URLSearchParams, URLSearchParamsEntry, URLSearchParamsEntryIterator,
51+
URLSearchParamsKeyIterator, URLSearchParamsValueIterator,
5252
};
5353

5454
#[cfg(feature = "std")]

src/url_search_params.rs

Lines changed: 81 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,10 @@ impl URLSearchParams {
179179
/// let params = URLSearchParams::parse("a=1")
180180
/// .expect("This is a valid URLSearchParams. Should have parsed it.");
181181
/// let mut keys = params.keys();
182-
/// assert!(keys.has_next());
183-
pub fn keys(&self) -> URLSearchParamsKeysIterator {
182+
/// assert!(keys.next().is_some());
183+
pub fn keys(&self) -> URLSearchParamsKeyIterator {
184184
let iterator = unsafe { ffi::ada_search_params_get_keys(self.0) };
185-
URLSearchParamsKeysIterator::new(iterator)
185+
URLSearchParamsKeyIterator::new(iterator)
186186
}
187187

188188
/// Returns all keys as an iterator
@@ -192,10 +192,24 @@ impl URLSearchParams {
192192
/// let params = URLSearchParams::parse("a=1")
193193
/// .expect("This is a valid URLSearchParams. Should have parsed it.");
194194
/// let mut values = params.values();
195-
/// assert!(values.has_next());
196-
pub fn values(&self) -> URLSearchParamsValuesIterator {
195+
/// assert!(values.next().is_some());
196+
pub fn values(&self) -> URLSearchParamsValueIterator {
197197
let iterator = unsafe { ffi::ada_search_params_get_values(self.0) };
198-
URLSearchParamsValuesIterator::new(iterator)
198+
URLSearchParamsValueIterator::new(iterator)
199+
}
200+
201+
/// Returns all entries as an iterator
202+
///
203+
/// ```
204+
/// use ada_url::URLSearchParams;
205+
/// let params = URLSearchParams::parse("a=1")
206+
/// .expect("This is a valid URLSearchParams. Should have parsed it.");
207+
/// let mut entries = params.entries();
208+
/// assert_eq!(entries.next(), Some(("a", "1")));
209+
/// ```
210+
pub fn entries(&self) -> URLSearchParamsEntryIterator {
211+
let iterator = unsafe { ffi::ada_search_params_get_entries(self.0) };
212+
URLSearchParamsEntryIterator::new(iterator)
199213
}
200214
}
201215

@@ -269,96 +283,76 @@ where
269283
}
270284
}
271285

272-
pub struct URLSearchParamsKeysIterator<'a> {
286+
pub struct URLSearchParamsKeyIterator<'a> {
273287
iterator: *mut ffi::ada_url_search_params_keys_iter,
274288
_phantom: core::marker::PhantomData<&'a str>,
275289
}
276290

277-
impl Drop for URLSearchParamsKeysIterator<'_> {
291+
impl Drop for URLSearchParamsKeyIterator<'_> {
278292
fn drop(&mut self) {
279293
unsafe { ffi::ada_free_search_params_keys_iter(self.iterator) }
280294
}
281295
}
282296

283-
impl<'a> Iterator for URLSearchParamsKeysIterator<'a> {
297+
impl<'a> Iterator for URLSearchParamsKeyIterator<'a> {
284298
type Item = &'a str;
285299

286300
fn next(&mut self) -> Option<Self::Item> {
287-
self.get_next()
288-
}
289-
}
290-
291-
impl<'a> URLSearchParamsKeysIterator<'a> {
292-
/// Returns true if iterator has a next value.
293-
pub fn has_next(&self) -> bool {
294-
unsafe { ffi::ada_search_params_keys_iter_has_next(self.iterator) }
295-
}
296-
297-
/// Returns a new value if it's available
298-
pub fn get_next(&mut self) -> Option<&'a str> {
299-
if self.has_next() {
300-
return None;
301+
let has_next = unsafe { ffi::ada_search_params_keys_iter_has_next(self.iterator) };
302+
if has_next {
303+
let string = unsafe { ffi::ada_search_params_keys_iter_next(self.iterator) };
304+
Some(string.as_str())
305+
} else {
306+
None
301307
}
302-
let string = unsafe { ffi::ada_search_params_keys_iter_next(self.iterator) };
303-
Some(string.as_str())
304308
}
305309
}
306310

307-
pub struct URLSearchParamsValuesIterator<'a> {
311+
pub struct URLSearchParamsValueIterator<'a> {
308312
iterator: *mut ffi::ada_url_search_params_values_iter,
309313
_phantom: core::marker::PhantomData<&'a str>,
310314
}
311315

312-
impl<'a> URLSearchParamsKeysIterator<'a> {
313-
fn new(iterator: *mut ffi::ada_url_search_params_keys_iter) -> URLSearchParamsKeysIterator<'a> {
314-
URLSearchParamsKeysIterator {
316+
impl<'a> URLSearchParamsKeyIterator<'a> {
317+
fn new(iterator: *mut ffi::ada_url_search_params_keys_iter) -> URLSearchParamsKeyIterator<'a> {
318+
URLSearchParamsKeyIterator {
315319
iterator,
316320
_phantom: core::marker::PhantomData,
317321
}
318322
}
319323
}
320324

321-
impl Drop for URLSearchParamsValuesIterator<'_> {
325+
impl Drop for URLSearchParamsValueIterator<'_> {
322326
fn drop(&mut self) {
323327
unsafe { ffi::ada_free_search_params_values_iter(self.iterator) }
324328
}
325329
}
326330

327-
impl<'a> Iterator for URLSearchParamsValuesIterator<'a> {
331+
impl<'a> Iterator for URLSearchParamsValueIterator<'a> {
328332
type Item = &'a str;
329333

330334
fn next(&mut self) -> Option<Self::Item> {
331-
self.get_next()
335+
let has_next = unsafe { ffi::ada_search_params_values_iter_has_next(self.iterator) };
336+
if has_next {
337+
let string = unsafe { ffi::ada_search_params_values_iter_next(self.iterator) };
338+
Some(string.as_str())
339+
} else {
340+
None
341+
}
332342
}
333343
}
334344

335-
impl<'a> URLSearchParamsValuesIterator<'a> {
345+
impl<'a> URLSearchParamsValueIterator<'a> {
336346
fn new(
337347
iterator: *mut ffi::ada_url_search_params_values_iter,
338-
) -> URLSearchParamsValuesIterator<'a> {
339-
URLSearchParamsValuesIterator {
348+
) -> URLSearchParamsValueIterator<'a> {
349+
URLSearchParamsValueIterator {
340350
iterator,
341351
_phantom: core::marker::PhantomData,
342352
}
343353
}
344354
}
345355

346-
impl<'a> URLSearchParamsValuesIterator<'a> {
347-
/// Returns true if iterator has a next value.
348-
pub fn has_next(&self) -> bool {
349-
unsafe { ffi::ada_search_params_values_iter_has_next(self.iterator) }
350-
}
351-
352-
/// Returns a new value if it's available
353-
pub fn get_next(&mut self) -> Option<&'a str> {
354-
if self.has_next() {
355-
return None;
356-
}
357-
let string = unsafe { ffi::ada_search_params_values_iter_next(self.iterator) };
358-
Some(string.as_str())
359-
}
360-
}
361-
362356
pub struct URLSearchParamsEntry<'a> {
363357
strings: *mut ffi::ada_strings,
364358
size: usize,
@@ -445,3 +439,39 @@ impl<'a> From<URLSearchParamsEntry<'a>> for Vec<&'a str> {
445439
vec
446440
}
447441
}
442+
443+
pub struct URLSearchParamsEntryIterator<'a> {
444+
iterator: *mut ffi::ada_url_search_params_entries_iter,
445+
_phantom: core::marker::PhantomData<&'a str>,
446+
}
447+
448+
impl<'a> URLSearchParamsEntryIterator<'a> {
449+
fn new(
450+
iterator: *mut ffi::ada_url_search_params_entries_iter,
451+
) -> URLSearchParamsEntryIterator<'a> {
452+
URLSearchParamsEntryIterator {
453+
iterator,
454+
_phantom: core::marker::PhantomData,
455+
}
456+
}
457+
}
458+
459+
impl Drop for URLSearchParamsEntryIterator<'_> {
460+
fn drop(&mut self) {
461+
unsafe { ffi::ada_free_search_params_entries_iter(self.iterator) }
462+
}
463+
}
464+
465+
impl<'a> Iterator for URLSearchParamsEntryIterator<'a> {
466+
type Item = (&'a str, &'a str);
467+
468+
fn next(&mut self) -> Option<Self::Item> {
469+
let has_next = unsafe { ffi::ada_search_params_entries_iter_has_next(self.iterator) };
470+
if has_next {
471+
let pair = unsafe { ffi::ada_search_params_entries_iter_next(self.iterator) };
472+
Some((pair.key.as_str(), pair.value.as_str()))
473+
} else {
474+
None
475+
}
476+
}
477+
}

0 commit comments

Comments
 (0)