use std::net::Ipv6Addr;
use serialize::binary::*;
use error::*;
pub fn read(decoder: &mut BinDecoder) -> ProtoResult<Ipv6Addr> {
let a: u16 = decoder.read_u16()?.unverified();
let b: u16 = decoder.read_u16()?.unverified();
let c: u16 = decoder.read_u16()?.unverified();
let d: u16 = decoder.read_u16()?.unverified();
let e: u16 = decoder.read_u16()?.unverified();
let f: u16 = decoder.read_u16()?.unverified();
let g: u16 = decoder.read_u16()?.unverified();
let h: u16 = decoder.read_u16()?.unverified();
Ok(Ipv6Addr::new(a, b, c, d, e, f, g, h))
}
pub fn emit(encoder: &mut BinEncoder, address: &Ipv6Addr) -> ProtoResult<()> {
let segments = address.segments();
encoder.emit_u16(segments[0])?;
encoder.emit_u16(segments[1])?;
encoder.emit_u16(segments[2])?;
encoder.emit_u16(segments[3])?;
encoder.emit_u16(segments[4])?;
encoder.emit_u16(segments[5])?;
encoder.emit_u16(segments[6])?;
encoder.emit_u16(segments[7])?;
Ok(())
}
#[cfg(test)]
mod tests {
use std::net::Ipv6Addr;
use std::str::FromStr;
use super::*;
use serialize::binary::bin_tests::{test_emit_data_set, test_read_data_set};
fn get_data() -> Vec<(Ipv6Addr, Vec<u8>)> {
vec![
(
Ipv6Addr::from_str("::").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("1::").unwrap(),
vec![0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("0:1::").unwrap(),
vec![0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("0:0:1::").unwrap(),
vec![0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("0:0:0:1::").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("::1:0:0:0").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("::1:0:0").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
),
(
Ipv6Addr::from_str("::1:0").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
),
(
Ipv6Addr::from_str("::1").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
),
(
Ipv6Addr::from_str("::127.0.0.1").unwrap(),
vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 1],
),
(
Ipv6Addr::from_str("FF00::192.168.64.32").unwrap(),
vec![255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 168, 64, 32],
),
]
}
#[test]
fn test_read() {
test_read_data_set(get_data(), |ref mut d| read(d));
}
#[test]
fn test_emit() {
test_emit_data_set(get_data(), |e, d| emit(e, &d));
}
}