1 use std
::ffi
::{CStr, CString}
;
7 /// A linked list of a strings
9 raw
: *mut curl_sys
::curl_slist
,
12 /// An iterator over `List`
16 cur
: *mut curl_sys
::curl_slist
,
19 pub fn raw(list
: &List
) -> *mut curl_sys
::curl_slist
{
23 pub unsafe fn from_raw(raw
: *mut curl_sys
::curl_slist
) -> List
{
27 unsafe impl Send
for List {}
30 /// Creates a new empty list of strings.
31 pub fn new() -> List
{
32 List { raw: 0 as *mut _ }
35 /// Appends some data into this list.
36 pub fn append(&mut self, data
: &str) -> Result
<(), Error
> {
37 let data
= CString
::new(data
)?
;
39 let raw
= curl_sys
::curl_slist_append(self.raw
, data
.as_ptr());
40 assert
!(!raw
.is_null());
46 /// Returns an iterator over the nodes in this list.
47 pub fn iter(&self) -> Iter
{
55 impl fmt
::Debug
for List
{
56 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
58 .entries(self.iter().map(String
::from_utf8_lossy
))
63 impl<'a
> IntoIterator
for &'a List
{
64 type IntoIter
= Iter
<'a
>;
67 fn into_iter(self) -> Iter
<'a
> {
74 unsafe { curl_sys::curl_slist_free_all(self.raw) }
78 impl<'a
> Iterator
for Iter
<'a
> {
81 fn next(&mut self) -> Option
<&'a
[u8]> {
82 if self.cur
.is_null() {
87 let ret
= Some(CStr
::from_ptr((*self.cur
).data
).to_bytes());
88 self.cur
= (*self.cur
).next
;
94 impl<'a
> fmt
::Debug
for Iter
<'a
> {
95 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
97 .entries(self.clone().map(String
::from_utf8_lossy
))