1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
 * Copyright (C) 2015 Benjamin Fry <benjaminfry@me.com>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

 //! Record type for all cname like records.
 //!
 //! A generic struct for all {*}NAME pointer RData records, CNAME, NS, and PTR. Here is the text for
 //! CNAME from RFC 1035, Domain Implementation and Specification, November 1987:
 //!
 //! [RFC 1035, DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION, November 1987](https://tools.ietf.org/html/rfc1035)
 //!
 //! ```text
 //! 3.3.1. CNAME RDATA format
 //!
 //!     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 //!     /                     CNAME                     /
 //!     /                                               /
 //!     +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 //!
 //! where:
 //!
 //! CNAME           A <domain-name> which specifies the canonical or primary
 //!                 name for the owner.  The owner name is an alias.
 //!
 //! CNAME RRs cause no additional section processing, but name servers may
 //! choose to restart the query at the canonical name in certain cases.  See
 //! the description of name server logic in [RFC-1034] for details.
 //! ```

use ::serialize::txt::*;
use ::serialize::binary::*;
use ::error::*;
use ::rr::domain::Name;


pub fn read(decoder: &mut BinDecoder) -> DecodeResult<Name> {
  Name::read(decoder)
}

pub fn emit(encoder: &mut BinEncoder, name_data: &Name) -> EncodeResult {
  try!(name_data.emit(encoder));
  Ok(())
}

pub fn parse(tokens: &Vec<Token>, origin: Option<&Name>) -> ParseResult<Name> {
  let mut token = tokens.iter();

  let name: Name = try!(token.next().ok_or(ParseError::MissingToken("name".to_string())).and_then(|t| if let &Token::CharData(ref s) = t {Name::parse(s, origin)} else {Err(ParseError::UnexpectedToken(t.clone()))} ));
  Ok(name)
}


#[test]
pub fn test() {
  let rdata = Name::new().label("www").label("example").label("com");

  let mut bytes = Vec::new();
  let mut encoder: BinEncoder = BinEncoder::new(&mut bytes);
  assert!(emit(&mut encoder, &rdata).is_ok());
  let bytes = encoder.as_bytes();

  println!("bytes: {:?}", bytes);

  let mut decoder: BinDecoder = BinDecoder::new(bytes);
  let read_rdata = read(&mut decoder);
  assert!(read_rdata.is_ok(), format!("error decoding: {:?}", read_rdata.unwrap_err()));
  assert_eq!(rdata, read_rdata.unwrap());
}