     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

    //! HTTP version
    //!
    //! This module contains a definition of the `Version` type. The `Version`
    //! type is intended to be accessed through the root of the crate
    //! (`http::Version`) rather than this module.
    //!
    //! The `Version` type contains constants that represent the various versions
    //! of the HTTP protocol.
    //!
    //! # Examples
    //!
    //! ```
    //! use http::Version;
    //!
    //! let http11 = Version::HTTP_11;
    //! let http2 = Version::HTTP_2;
    //! assert!(http11 != http2);
    //!
    //! println!("{:?}", http2);
    //! ```

    use std::fmt;

    /// Represents a version of the HTTP spec.
    #[derive(PartialEq, PartialOrd, Copy, Clone, Eq, Ord, Hash)]
    pub struct Version(Http);

    impl Version {
        /// `HTTP/0.9`
        pub const HTTP_09: Version = Version(Http::Http09);

        /// `HTTP/1.0`
        pub const HTTP_10: Version = Version(Http::Http10);

        /// `HTTP/1.1`
        pub const HTTP_11: Version = Version(Http::Http11);

        /// `HTTP/2.0`
        pub const HTTP_2: Version = Version(Http::H2);

        /// `HTTP/3.0`
        pub const HTTP_3: Version = Version(Http::H3);
    }

    #[derive(PartialEq, PartialOrd, Copy, Clone, Eq, Ord, Hash)]
    enum Http {
        Http09,
        Http10,
        Http11,
        H2,
        H3,
        __NonExhaustive,
    }

    impl Default for Version {
        #[inline]
        fn default() -> Version {
            Version::HTTP_11
        }
    }

    impl fmt::Debug for Version {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            use self::Http::*;

            f.write_str(match self.0 {
                Http09 => "HTTP/0.9",
                Http10 => "HTTP/1.0",
                Http11 => "HTTP/1.1",
                H2 => "HTTP/2.0",
                H3 => "HTTP/3.0",
                __NonExhaustive => unreachable!(),
            })
        }
    }