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
81
82
83
84
85
86
//! DNS CLASSes.

//------------ Class ---------------------------------------------------------

int_enum! {
    /// DNS CLASSes.
    ///
    /// The domain name space is partitioned into separate classes for different
    /// network types. That is, each class has its own separate record tree
    /// starting at the root. However, in practice, only the IN class is really
    /// relevant.
    ///
    /// In addition, there are query classes or QCLASSes that are used in
    /// questions or UPDATE queries, namely NONE and ANY (or *).
    ///
    /// Classes are represented by a 16 bit value. The enum wraps these values.
    ///
    /// See [RFC 1034] for the introduction of classes, section 3.2 of
    /// [RFC 6895] for a discussion of the current state of afairs, and
    /// the [DNS CLASSes IANA registry] for an overview of assigned values.
    /// This type is complete as of the registry update of 2019-01-28.
    ///
    /// [RFC 1034]: https://tools.ietf.org/html/rfc1034
    /// [RFC 6895]: https://tools.ietf.org/html/rfc6895
    /// [DNS CLASSes IANA registry]: http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-2
    =>
    Class, u16;

    /// Internet (IN).
    ///
    /// This class is defined in RFC 1035 and really the only one relevant
    /// at all.
    (IN => 1, b"IN")

    /// Chaosnet (CH).
    ///
    /// A network protocol developed at MIT in the 1970s. Reused by BIND for
    /// built-in server information zones.",
    (CH => 3, b"CH")

    /// Hesiod (HS).
    ///
    /// A system information protocol part of MIT's Project Athena.",
    (HS => 4, b"HS")

    /// Query class None.
    ///
    /// Defined in RFC 2136, this class is used in UPDATE queries to
    /// require that an RRset does not exist prior to the update.",
    (NONE => 0xFE, b"NONE")

    /// Query class * (ANY).
    ///
    /// This class can be used in a query to indicate that records for the
    /// given name from any class are requested.",
    (ANY => 0xFF, b"*")
}

int_enum_str_with_prefix!(Class, "CLASS", b"CLASS", u16, "unknown class");

//============ Tests =========================================================

#[cfg(test)]
mod test {

    #[cfg(feature = "serde")]
    #[test]
    fn ser_de() {
        use super::Class;
        use serde_test::{assert_tokens, Configure, Token};

        assert_tokens(&Class::IN.readable(), &[Token::Str("IN")]);
        assert_tokens(&Class(5).readable(), &[Token::Str("CLASS5")]);
        assert_tokens(&Class::IN.compact(), &[Token::U16(1)]);
        assert_tokens(&Class(5).compact(), &[Token::U16(5)]);
    }

    #[cfg(feature = "std")]
    #[test]
    fn debug() {
        use super::Class;

        assert_eq!(format!("{:?}", Class::IN), "Class::IN");
        assert_eq!(format!("{:?}", Class(69)), "Class(69)");
    }
}