httpio 0.2.4

A transport-agnostic, async HTTP/1.1 client library for any runtime.
Documentation
pub fn split_at_first<'a>(s: &'a str, delimiter: &str) -> Option<(&'a str, &'a str)> {
    s.find(delimiter).map(|pos| {
        let (left, right) = s.split_at(pos);
        (left, &right[delimiter.len()..])
    })
}

pub fn join_with_delimiter(left: &str, right: &str, delimiter: &str) -> String {
    format!("{}{}{}", left, delimiter, right)
}

pub fn latin1_to_string(s: &[u8]) -> String {
    let mut result = String::with_capacity(s.len() * 2);
    for &c in s {
        result.push(c as char);
    }
    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_split_at_first() {
        assert_eq!(split_at_first("key=value", "="), Some(("key", "value")));
        assert_eq!(split_at_first("key:value", ":"), Some(("key", "value")));
        assert_eq!(split_at_first("key", "="), None);
        assert_eq!(split_at_first("", "="), None);
    }

    #[test]
    fn test_join_with_delimiter() {
        assert_eq!(join_with_delimiter("key", "value", "="), "key=value");
        assert_eq!(join_with_delimiter("hello", "world", ", "), "hello, world");
        assert_eq!(join_with_delimiter("", "value", "="), "=value");
    }

    #[test]
    fn test_latin1_to_string() {
        assert_eq!(latin1_to_string(b"Hello World"), "Hello World");
        assert_eq!(latin1_to_string(b""), "");
        assert_eq!(latin1_to_string(&[65, 66, 67]), "ABC");
    }
}